2013-01-24 23:00:42 +00:00
|
|
|
#include <precomp.h>
|
2000-06-16 07:36:10 +00:00
|
|
|
|
2004-03-23 22:50:14 +00:00
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
2003-07-20 00:13:36 +00:00
|
|
|
|
2006-11-09 01:45:42 +00:00
|
|
|
HDC
|
|
|
|
FASTCALL
|
2014-10-27 23:37:05 +00:00
|
|
|
IntCreateDICW(
|
|
|
|
LPCWSTR lpwszDriver,
|
|
|
|
LPCWSTR lpwszDevice,
|
|
|
|
LPCWSTR lpwszOutput,
|
|
|
|
PDEVMODEW lpInitData,
|
|
|
|
ULONG iType)
|
2006-11-09 01:45:42 +00:00
|
|
|
{
|
2010-12-27 16:23:59 +00:00
|
|
|
UNICODE_STRING Device, Output;
|
2014-10-27 23:37:05 +00:00
|
|
|
HDC hdc = NULL;
|
2010-12-27 16:23:59 +00:00
|
|
|
BOOL Display = FALSE, Default = FALSE;
|
|
|
|
ULONG UMdhpdev = 0;
|
|
|
|
|
|
|
|
HANDLE hspool = NULL;
|
|
|
|
|
|
|
|
if ( !ghSpooler && !LoadTheSpoolerDrv())
|
2006-11-09 01:45:42 +00:00
|
|
|
{
|
2010-12-27 16:23:59 +00:00
|
|
|
DPRINT1("WinSpooler.Drv Did not load!\n");
|
2006-11-09 01:45:42 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-08-30 10:51:12 +00:00
|
|
|
DPRINT("WinSpooler.Drv Loaded! hMod -> 0x%p\n", ghSpooler);
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ((!lpwszDevice) && (!lpwszDriver))
|
|
|
|
{
|
|
|
|
Default = TRUE; // Ask Win32k to set Default device.
|
|
|
|
Display = TRUE; // Most likely to be DISPLAY.
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ((lpwszDevice) && (wcslen(lpwszDevice) != 0)) // First
|
|
|
|
{
|
|
|
|
if (!_wcsnicmp(lpwszDevice, L"\\\\.\\DISPLAY",11)) Display = TRUE;
|
|
|
|
RtlInitUnicodeString(&Device, lpwszDevice);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (lpwszDriver) // Second
|
|
|
|
{
|
|
|
|
if ((!_wcsnicmp(lpwszDriver, L"DISPLAY",7)) ||
|
|
|
|
(!_wcsnicmp(lpwszDriver, L"\\\\.\\DISPLAY",11))) Display = TRUE;
|
|
|
|
RtlInitUnicodeString(&Device, lpwszDriver);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lpwszOutput) RtlInitUnicodeString(&Output, lpwszOutput);
|
|
|
|
|
|
|
|
if (!Display)
|
|
|
|
{
|
|
|
|
//Handle Print device or something else.
|
|
|
|
DPRINT1("Not a DISPLAY device! %wZ\n", &Device);
|
2006-11-09 01:45:42 +00:00
|
|
|
}
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
hdc = NtGdiOpenDCW((Default ? NULL : &Device),
|
|
|
|
(PDEVMODEW) lpInitData,
|
|
|
|
(lpwszOutput ? &Output : NULL),
|
|
|
|
iType, // DCW 0 and ICW 1.
|
|
|
|
Display,
|
|
|
|
hspool,
|
|
|
|
(PVOID) &UMdhpdev );
|
2007-04-29 06:50:36 +00:00
|
|
|
#if 0
|
2006-11-09 01:45:42 +00:00
|
|
|
// Handle something other than a normal dc object.
|
2014-10-27 23:37:05 +00:00
|
|
|
if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC)
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
|
|
|
PDC_ATTR Dc_Attr;
|
|
|
|
PLDC pLDC;
|
2006-11-09 01:45:42 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID*)&Dc_Attr);
|
2006-11-09 01:45:42 +00:00
|
|
|
|
2010-12-27 16:23:59 +00:00
|
|
|
pLDC = LocalAlloc(LMEM_ZEROINIT, sizeof(LDC));
|
2006-11-09 01:45:42 +00:00
|
|
|
|
2010-12-27 16:23:59 +00:00
|
|
|
Dc_Attr->pvLDC = pLDC;
|
2014-10-27 23:37:05 +00:00
|
|
|
pLDC->hDC = hdc;
|
2010-12-27 16:23:59 +00:00
|
|
|
pLDC->iType = LDC_LDC; // 1 (init) local DC, 2 EMF LDC
|
|
|
|
DbgPrint("DC_ATTR Allocated -> 0x%x\n",Dc_Attr);
|
|
|
|
}
|
2007-04-29 06:50:36 +00:00
|
|
|
#endif
|
2014-10-27 23:37:05 +00:00
|
|
|
return hdc;
|
2006-11-09 01:45:42 +00:00
|
|
|
}
|
|
|
|
|
2003-08-05 15:41:03 +00:00
|
|
|
|
2007-08-23 14:02:10 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
HDC
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
CreateCompatibleDC(
|
|
|
|
_In_ HDC hdc)
|
2007-08-23 14:02:10 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
HDC hdcNew;
|
|
|
|
// PDC_ATTR pdcattr;
|
2008-05-12 18:16:48 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
hdcNew = NtGdiCreateCompatibleDC(hdc);
|
2008-05-12 18:16:48 +00:00
|
|
|
#if 0
|
2014-10-27 23:37:05 +00:00
|
|
|
if ( hdc && hdcNew)
|
2008-05-12 18:16:48 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
if (GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID*)&pdcattr))
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
if (pdcattr->pvLIcm) IcmCompatibleDC(hdcNew, hdc, pdcattr);
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
2008-05-12 18:16:48 +00:00
|
|
|
}
|
|
|
|
#endif
|
2014-10-27 23:37:05 +00:00
|
|
|
|
|
|
|
return hdcNew;
|
2007-08-23 14:02:10 +00:00
|
|
|
}
|
|
|
|
|
2003-08-05 15:41:03 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2004-12-30 02:32:24 +00:00
|
|
|
HDC
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2004-12-30 02:32:24 +00:00
|
|
|
CreateDCA (
|
2014-10-27 23:37:05 +00:00
|
|
|
LPCSTR lpszDriver,
|
|
|
|
LPCSTR lpszDevice,
|
|
|
|
LPCSTR lpszOutput,
|
|
|
|
CONST DEVMODEA * lpdvmInit)
|
2003-08-05 15:41:03 +00:00
|
|
|
{
|
2010-12-27 16:23:59 +00:00
|
|
|
ANSI_STRING DriverA, DeviceA, OutputA;
|
|
|
|
UNICODE_STRING DriverU, DeviceU, OutputU;
|
|
|
|
LPDEVMODEW dvmInitW = NULL;
|
2014-10-27 23:37:05 +00:00
|
|
|
HDC hdc;
|
2003-08-05 15:41:03 +00:00
|
|
|
|
2010-12-27 16:23:59 +00:00
|
|
|
/*
|
|
|
|
* If needed, convert to Unicode
|
|
|
|
* any string parameter.
|
|
|
|
*/
|
2004-05-15 08:52:25 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
if (lpszDriver != NULL)
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
|
|
|
RtlInitAnsiString(&DriverA, (LPSTR)lpszDriver);
|
|
|
|
RtlAnsiStringToUnicodeString(&DriverU, &DriverA, TRUE);
|
|
|
|
}
|
|
|
|
else
|
2014-10-27 23:37:05 +00:00
|
|
|
{
|
2010-12-27 16:23:59 +00:00
|
|
|
DriverU.Buffer = NULL;
|
2014-10-27 23:37:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (lpszDevice != NULL)
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
|
|
|
RtlInitAnsiString(&DeviceA, (LPSTR)lpszDevice);
|
|
|
|
RtlAnsiStringToUnicodeString(&DeviceU, &DeviceA, TRUE);
|
|
|
|
}
|
|
|
|
else
|
2014-10-27 23:37:05 +00:00
|
|
|
{
|
2010-12-27 16:23:59 +00:00
|
|
|
DeviceU.Buffer = NULL;
|
2014-10-27 23:37:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (lpszOutput != NULL)
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
|
|
|
RtlInitAnsiString(&OutputA, (LPSTR)lpszOutput);
|
|
|
|
RtlAnsiStringToUnicodeString(&OutputU, &OutputA, TRUE);
|
|
|
|
}
|
|
|
|
else
|
2014-10-27 23:37:05 +00:00
|
|
|
{
|
2010-12-27 16:23:59 +00:00
|
|
|
OutputU.Buffer = NULL;
|
2014-10-27 23:37:05 +00:00
|
|
|
}
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
if (lpdvmInit != NULL)
|
2010-12-27 16:23:59 +00:00
|
|
|
dvmInitW = GdiConvertToDevmodeW((LPDEVMODEA)lpdvmInit);
|
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
hdc = IntCreateDICW(DriverU.Buffer,
|
|
|
|
DeviceU.Buffer,
|
|
|
|
OutputU.Buffer,
|
|
|
|
lpdvmInit ? dvmInitW : NULL,
|
|
|
|
0);
|
|
|
|
HEAP_free(dvmInitW);
|
|
|
|
|
|
|
|
/* Free Unicode parameters. */
|
2010-12-27 16:23:59 +00:00
|
|
|
RtlFreeUnicodeString(&DriverU);
|
|
|
|
RtlFreeUnicodeString(&DeviceU);
|
|
|
|
RtlFreeUnicodeString(&OutputU);
|
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
/* Return the DC handle. */
|
|
|
|
return hdc;
|
2003-08-05 15:41:03 +00:00
|
|
|
}
|
|
|
|
|
2004-12-30 02:32:24 +00:00
|
|
|
|
2003-08-05 15:41:03 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2004-12-30 02:32:24 +00:00
|
|
|
HDC
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2004-12-30 02:32:24 +00:00
|
|
|
CreateDCW (
|
2014-10-27 23:37:05 +00:00
|
|
|
LPCWSTR lpwszDriver,
|
|
|
|
LPCWSTR lpwszDevice,
|
|
|
|
LPCWSTR lpwszOutput,
|
|
|
|
CONST DEVMODEW *lpInitData)
|
2003-08-05 15:41:03 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
return IntCreateDICW(lpwszDriver,
|
|
|
|
lpwszDevice,
|
|
|
|
lpwszOutput,
|
|
|
|
(PDEVMODEW)lpInitData,
|
|
|
|
0);
|
2003-08-05 15:41:03 +00:00
|
|
|
}
|
|
|
|
|
2004-12-30 02:32:24 +00:00
|
|
|
|
2003-08-05 15:41:03 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2004-12-30 02:32:24 +00:00
|
|
|
HDC
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2004-12-30 02:32:24 +00:00
|
|
|
CreateICW(
|
2014-10-27 23:37:05 +00:00
|
|
|
LPCWSTR lpszDriver,
|
|
|
|
LPCWSTR lpszDevice,
|
|
|
|
LPCWSTR lpszOutput,
|
|
|
|
CONST DEVMODEW *lpdvmInit)
|
2003-08-05 15:41:03 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
return IntCreateDICW(lpszDriver,
|
|
|
|
lpszDevice,
|
|
|
|
lpszOutput,
|
|
|
|
(PDEVMODEW)lpdvmInit,
|
|
|
|
1);
|
2003-08-05 15:41:03 +00:00
|
|
|
}
|
|
|
|
|
2004-12-30 02:32:24 +00:00
|
|
|
|
2003-08-05 15:41:03 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2004-12-30 02:32:24 +00:00
|
|
|
HDC
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2004-12-30 02:32:24 +00:00
|
|
|
CreateICA(
|
2014-10-27 23:37:05 +00:00
|
|
|
LPCSTR lpszDriver,
|
|
|
|
LPCSTR lpszDevice,
|
|
|
|
LPCSTR lpszOutput,
|
|
|
|
CONST DEVMODEA *lpdvmInit)
|
2003-08-05 15:41:03 +00:00
|
|
|
{
|
2010-12-27 16:23:59 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
LPWSTR lpszDriverW, lpszDeviceW, lpszOutputW;
|
|
|
|
LPDEVMODEW dvmInitW = NULL;
|
2014-10-27 23:37:05 +00:00
|
|
|
HDC hdc = 0;
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
Status = HEAP_strdupA2W(&lpszDriverW, lpszDriver);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
2004-12-30 02:32:24 +00:00
|
|
|
else
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
Status = HEAP_strdupA2W(&lpszDeviceW, lpszDevice);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
2010-12-27 16:23:59 +00:00
|
|
|
else
|
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
Status = HEAP_strdupA2W(&lpszOutputW, lpszOutput);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
2010-12-27 16:23:59 +00:00
|
|
|
else
|
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
if (lpdvmInit)
|
2010-12-27 16:23:59 +00:00
|
|
|
dvmInitW = GdiConvertToDevmodeW((LPDEVMODEA)lpdvmInit);
|
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
hdc = IntCreateDICW(lpszDriverW,
|
|
|
|
lpszDeviceW,
|
|
|
|
lpszOutputW,
|
|
|
|
lpdvmInit ? dvmInitW : NULL,
|
|
|
|
1 );
|
|
|
|
HEAP_free(dvmInitW);
|
|
|
|
HEAP_free(lpszOutputW);
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
2014-10-27 23:37:05 +00:00
|
|
|
HEAP_free(lpszDeviceW);
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
2014-10-27 23:37:05 +00:00
|
|
|
HEAP_free(lpszDriverW);
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
2014-10-27 23:37:05 +00:00
|
|
|
|
|
|
|
return hdc;
|
2003-08-05 15:41:03 +00:00
|
|
|
}
|
|
|
|
|
2004-12-30 02:32:24 +00:00
|
|
|
|
2003-08-05 15:41:03 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
BOOL
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
DeleteDC(HDC hdc)
|
2006-11-09 01:45:42 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
BOOL bResult = TRUE;
|
2010-12-27 16:23:59 +00:00
|
|
|
PLDC pLDC = NULL;
|
|
|
|
HANDLE hPrinter = NULL;
|
2014-10-27 23:37:05 +00:00
|
|
|
ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
|
2006-11-09 01:45:42 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
pLDC = GdiGetLDC(hdc);
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2010-12-27 16:23:59 +00:00
|
|
|
if (hType != GDILoObjType_LO_DC_TYPE)
|
|
|
|
{
|
2014-12-29 14:25:30 +00:00
|
|
|
return METADC_DeleteDC(hdc);
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
bResult = NtGdiDeleteObjectApp(hdc);
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
if (bResult && pLDC)
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
|
|
|
DPRINT1("Delete the Local DC structure\n");
|
|
|
|
LocalFree( pLDC );
|
|
|
|
}
|
2014-10-27 23:37:05 +00:00
|
|
|
|
|
|
|
if (hPrinter)
|
|
|
|
fpClosePrinter(hPrinter);
|
|
|
|
|
|
|
|
return bResult;
|
2006-11-09 01:45:42 +00:00
|
|
|
}
|
|
|
|
|
2014-10-28 21:09:01 +00:00
|
|
|
|
2006-11-09 01:45:42 +00:00
|
|
|
/*
|
2014-10-28 21:09:01 +00:00
|
|
|
* @unimplemented
|
2006-11-09 01:45:42 +00:00
|
|
|
*/
|
2014-10-28 21:09:01 +00:00
|
|
|
INT
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-28 21:09:01 +00:00
|
|
|
SaveDC(IN HDC hdc)
|
2003-08-05 15:41:03 +00:00
|
|
|
{
|
2014-12-29 14:25:30 +00:00
|
|
|
HANDLE_METADC0P(INT, SaveDC, 0, hdc);
|
2014-10-28 21:09:01 +00:00
|
|
|
return NtGdiSaveDC(hdc);
|
|
|
|
}
|
2012-10-06 08:33:17 +00:00
|
|
|
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-10-28 21:09:01 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
RestoreDC(IN HDC hdc,
|
|
|
|
IN INT iLevel)
|
|
|
|
{
|
2014-12-29 14:25:30 +00:00
|
|
|
HANDLE_METADC(BOOL, RestoreDC, FALSE, hdc, iLevel);
|
2014-10-28 21:09:01 +00:00
|
|
|
return NtGdiRestoreDC(hdc, iLevel);
|
|
|
|
}
|
2010-12-27 16:23:59 +00:00
|
|
|
|
|
|
|
|
2014-10-28 21:09:01 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
CancelDC(HDC hDC)
|
|
|
|
{
|
|
|
|
PDC_ATTR pDc_Attr;
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-10-28 21:09:01 +00:00
|
|
|
if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC &&
|
|
|
|
GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_METADC )
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
2014-10-28 21:09:01 +00:00
|
|
|
PLDC pLDC = GdiGetLDC(hDC);
|
|
|
|
if ( !pLDC )
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
2014-10-28 21:09:01 +00:00
|
|
|
SetLastError(ERROR_INVALID_HANDLE);
|
|
|
|
return FALSE;
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
2014-10-28 21:09:01 +00:00
|
|
|
/* If a document has started set it to die. */
|
|
|
|
if (pLDC->Flags & LDC_INIT_DOCUMENT) pLDC->Flags |= LDC_KILL_DOCUMENT;
|
2012-10-06 08:33:17 +00:00
|
|
|
|
2014-10-28 21:09:01 +00:00
|
|
|
return NtGdiCancelDC(hDC);
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
2012-10-06 08:33:17 +00:00
|
|
|
|
2014-10-28 21:09:01 +00:00
|
|
|
if (GdiGetHandleUserData((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC, (PVOID) &pDc_Attr))
|
|
|
|
{
|
|
|
|
pDc_Attr->ulDirty_ &= ~DC_PLAYMETAFILE;
|
|
|
|
return TRUE;
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
2012-10-06 08:33:17 +00:00
|
|
|
|
2014-10-28 21:09:01 +00:00
|
|
|
return FALSE;
|
2007-11-04 22:10:59 +00:00
|
|
|
}
|
2004-12-30 02:32:24 +00:00
|
|
|
|
2007-08-08 18:58:06 +00:00
|
|
|
INT
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
GetArcDirection(
|
|
|
|
_In_ HDC hdc)
|
2007-08-08 18:58:06 +00:00
|
|
|
{
|
2010-12-27 16:23:59 +00:00
|
|
|
return GetDCDWord( hdc, GdiGetArcDirection, 0);
|
2007-08-08 18:58:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
INT
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
SetArcDirection(
|
2014-12-29 14:25:30 +00:00
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ INT nDirection)
|
2007-08-08 18:58:06 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
return GetAndSetDCDWord(hdc, GdiGetSetArcDirection, nDirection, 0, 0, 0);
|
2007-08-08 18:58:06 +00:00
|
|
|
}
|
|
|
|
|
2014-10-28 21:09:01 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
GdiReleaseDC(HDC hdc)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
GdiCleanCacheDC(HDC hdc)
|
|
|
|
{
|
|
|
|
if (GDI_HANDLE_GET_TYPE(hdc) == GDILoObjType_LO_DC_TYPE)
|
|
|
|
return TRUE;
|
|
|
|
SetLastError(ERROR_INVALID_HANDLE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
HDC
|
|
|
|
WINAPI
|
|
|
|
GdiConvertAndCheckDC(HDC hdc)
|
|
|
|
{
|
|
|
|
PLDC pldc;
|
|
|
|
ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
|
|
|
|
if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE)
|
|
|
|
return hdc;
|
|
|
|
pldc = GdiGetLDC(hdc);
|
|
|
|
if (pldc)
|
|
|
|
{
|
|
|
|
if (pldc->Flags & LDC_SAPCALLBACK) GdiSAPCallback(pldc);
|
|
|
|
if (pldc->Flags & LDC_KILL_DOCUMENT) return NULL;
|
|
|
|
if (pldc->Flags & LDC_STARTPAGE) StartPage(hdc);
|
|
|
|
return hdc;
|
|
|
|
}
|
|
|
|
SetLastError(ERROR_INVALID_HANDLE);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-04-23 19:22:17 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*
|
|
|
|
*/
|
2007-08-31 14:41:01 +00:00
|
|
|
HGDIOBJ
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2012-04-23 19:22:17 +00:00
|
|
|
GetCurrentObject(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ UINT uObjectType)
|
2007-08-31 14:41:01 +00:00
|
|
|
{
|
2012-04-24 14:49:09 +00:00
|
|
|
PDC_ATTR pdcattr = NULL;
|
2012-04-23 19:22:17 +00:00
|
|
|
|
|
|
|
/* Check if this is a user mode object */
|
|
|
|
if ((uObjectType == OBJ_PEN) ||
|
|
|
|
(uObjectType == OBJ_EXTPEN) ||
|
|
|
|
(uObjectType == OBJ_BRUSH) ||
|
|
|
|
(uObjectType == OBJ_COLORSPACE))
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
2014-10-28 00:55:22 +00:00
|
|
|
/* Get the DC attribute */
|
2012-04-23 19:22:17 +00:00
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
2014-10-28 00:55:22 +00:00
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
2012-04-23 19:22:17 +00:00
|
|
|
}
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2012-04-23 19:22:17 +00:00
|
|
|
/* Check what object was requested */
|
|
|
|
switch (uObjectType)
|
|
|
|
{
|
|
|
|
case OBJ_EXTPEN:
|
|
|
|
case OBJ_PEN:
|
|
|
|
return pdcattr->hpen;
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2012-04-23 19:22:17 +00:00
|
|
|
case OBJ_BRUSH:
|
|
|
|
return pdcattr->hbrush;
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2012-04-23 19:22:17 +00:00
|
|
|
case OBJ_COLORSPACE:
|
|
|
|
return pdcattr->hColorSpace;
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2012-04-23 19:22:17 +00:00
|
|
|
case OBJ_PAL:
|
|
|
|
uObjectType = GDI_OBJECT_TYPE_PALETTE;
|
2010-12-27 16:23:59 +00:00
|
|
|
break;
|
|
|
|
|
2012-04-23 19:22:17 +00:00
|
|
|
case OBJ_FONT:
|
|
|
|
uObjectType = GDI_OBJECT_TYPE_FONT;
|
2010-12-27 16:23:59 +00:00
|
|
|
break;
|
2007-08-31 14:41:01 +00:00
|
|
|
|
2012-04-23 19:22:17 +00:00
|
|
|
case OBJ_BITMAP:
|
|
|
|
uObjectType = GDI_OBJECT_TYPE_BITMAP;
|
|
|
|
break;
|
2007-08-31 14:41:01 +00:00
|
|
|
|
2012-04-23 19:22:17 +00:00
|
|
|
/* All others are invalid */
|
|
|
|
default:
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return NULL;
|
2007-09-01 02:51:48 +00:00
|
|
|
}
|
2012-04-23 19:22:17 +00:00
|
|
|
|
|
|
|
/* Pass the request to win32k */
|
|
|
|
return NtGdiGetDCObject(hdc, uObjectType);
|
2007-09-01 02:51:48 +00:00
|
|
|
}
|
|
|
|
|
2014-10-28 21:09:01 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
WINAPI
|
|
|
|
EnumObjects(HDC hdc,
|
|
|
|
int nObjectType,
|
|
|
|
GOBJENUMPROC lpObjectFunc,
|
|
|
|
LPARAM lParam)
|
|
|
|
{
|
|
|
|
ULONG ObjectsCount;
|
|
|
|
ULONG Size;
|
|
|
|
PVOID Buffer = NULL;
|
|
|
|
DWORD_PTR EndOfBuffer;
|
|
|
|
int Result = 0;
|
|
|
|
|
|
|
|
switch (nObjectType)
|
|
|
|
{
|
|
|
|
case OBJ_BRUSH:
|
|
|
|
Size = sizeof(LOGBRUSH);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case OBJ_PEN:
|
|
|
|
Size = sizeof(LOGPEN);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
ObjectsCount = NtGdiEnumObjects(hdc, nObjectType, 0, NULL);
|
|
|
|
if (!ObjectsCount) return 0;
|
|
|
|
|
|
|
|
Buffer = HeapAlloc(GetProcessHeap(), 0, ObjectsCount * Size);
|
|
|
|
if (!Buffer)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!NtGdiEnumObjects(hdc, nObjectType, ObjectsCount * Size, Buffer))
|
|
|
|
{
|
|
|
|
HeapFree(GetProcessHeap(), 0, Buffer);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
EndOfBuffer = (DWORD_PTR)Buffer + (ObjectsCount * Size);
|
|
|
|
while ((DWORD_PTR)Buffer < EndOfBuffer)
|
|
|
|
{
|
|
|
|
Result = lpObjectFunc(Buffer, lParam);
|
|
|
|
if (!Result) break;
|
|
|
|
Buffer = (PVOID)((DWORD_PTR)Buffer + Size);
|
|
|
|
}
|
|
|
|
|
|
|
|
HeapFree(GetProcessHeap(), 0, Buffer);
|
|
|
|
return Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-10-21 02:56:36 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
GetDeviceCaps(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ int nIndex)
|
2008-10-21 02:56:36 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
2010-12-27 16:23:59 +00:00
|
|
|
PDEVCAPS pDevCaps = GdiDevCaps; // Primary display device capabilities.
|
|
|
|
DPRINT("Device CAPS1\n");
|
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
HANDLE_METADC(INT, GetDeviceCaps, 0, hdc, nIndex);
|
|
|
|
|
|
|
|
/* Get the DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
2014-12-29 14:25:30 +00:00
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return 0;
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
2014-10-28 00:55:22 +00:00
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
if (!(pdcattr->ulDirty_ & DC_PRIMARY_DISPLAY))
|
|
|
|
return NtGdiGetDeviceCaps(hdc, nIndex);
|
2010-04-26 21:49:09 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
switch (nIndex)
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
2008-10-21 02:56:36 +00:00
|
|
|
case DRIVERVERSION:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulVersion;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case TECHNOLOGY:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulTechnology;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case HORZSIZE:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulHorzSize;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case VERTSIZE:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulVertSize;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case HORZRES:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulHorzRes;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case VERTRES:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulVertRes;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case LOGPIXELSX:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulLogPixelsX;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case LOGPIXELSY:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulLogPixelsY;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case BITSPIXEL:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulBitsPixel;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case PLANES:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulPlanes;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case NUMBRUSHES:
|
2010-12-27 16:23:59 +00:00
|
|
|
return -1;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case NUMPENS:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulNumPens;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case NUMFONTS:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulNumFonts;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case NUMCOLORS:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulNumColors;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case ASPECTX:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulAspectX;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case ASPECTY:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulAspectY;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case ASPECTXY:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulAspectXY;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case CLIPCAPS:
|
2010-12-27 16:23:59 +00:00
|
|
|
return CP_RECTANGLE;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case SIZEPALETTE:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulSizePalette;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case NUMRESERVED:
|
2010-12-27 16:23:59 +00:00
|
|
|
return 20;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case COLORRES:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulColorRes;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case DESKTOPVERTRES:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulVertRes;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case DESKTOPHORZRES:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulHorzRes;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case BLTALIGNMENT:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulBltAlignment;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case SHADEBLENDCAPS:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulShadeBlend;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case COLORMGMTCAPS:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulColorMgmtCaps;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case PHYSICALWIDTH:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulPhysicalWidth;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case PHYSICALHEIGHT:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulPhysicalHeight;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case PHYSICALOFFSETX:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulPhysicalOffsetX;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case PHYSICALOFFSETY:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulPhysicalOffsetY;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case VREFRESH:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulVRefresh;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case RASTERCAPS:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulRasterCaps;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case CURVECAPS:
|
2010-12-27 16:23:59 +00:00
|
|
|
return (CC_CIRCLES | CC_PIE | CC_CHORD | CC_ELLIPSES | CC_WIDE |
|
|
|
|
CC_STYLED | CC_WIDESTYLED | CC_INTERIORS | CC_ROUNDRECT);
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case LINECAPS:
|
2010-12-27 16:23:59 +00:00
|
|
|
return (LC_POLYLINE | LC_MARKER | LC_POLYMARKER | LC_WIDE |
|
|
|
|
LC_STYLED | LC_WIDESTYLED | LC_INTERIORS);
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case POLYGONALCAPS:
|
2010-12-27 16:23:59 +00:00
|
|
|
return (PC_POLYGON | PC_RECTANGLE | PC_WINDPOLYGON | PC_SCANLINE |
|
|
|
|
PC_WIDE | PC_STYLED | PC_WIDESTYLED | PC_INTERIORS);
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case TEXTCAPS:
|
2010-12-27 16:23:59 +00:00
|
|
|
return pDevCaps->ulTextCaps;
|
2008-10-21 02:56:36 +00:00
|
|
|
|
|
|
|
case PDEVICESIZE:
|
|
|
|
case SCALINGFACTORX:
|
|
|
|
case SCALINGFACTORY:
|
|
|
|
default:
|
2010-12-27 16:23:59 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return 0;
|
2008-10-21 02:56:36 +00:00
|
|
|
}
|
2007-09-01 02:51:48 +00:00
|
|
|
|
2003-08-05 15:41:03 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2004-12-30 02:32:24 +00:00
|
|
|
DWORD
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2004-12-30 02:32:24 +00:00
|
|
|
GetRelAbs(
|
2014-10-27 23:37:05 +00:00
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ DWORD dwIgnore)
|
2003-08-05 15:41:03 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
return GetDCDWord(hdc, GdiGetRelAbs, 0);
|
2003-08-05 15:41:03 +00:00
|
|
|
}
|
2003-12-15 20:47:57 +00:00
|
|
|
|
2006-12-28 22:36:53 +00:00
|
|
|
|
2007-08-08 18:58:06 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2010-03-28 15:32:23 +00:00
|
|
|
INT
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2007-08-08 18:58:06 +00:00
|
|
|
SetRelAbs(
|
2010-12-27 16:23:59 +00:00
|
|
|
HDC hdc,
|
2014-10-27 23:37:05 +00:00
|
|
|
INT Mode)
|
2007-08-08 18:58:06 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
return GetAndSetDCDWord(hdc, GdiGetSetRelAbs, Mode, 0, 0, 0);
|
2007-08-08 18:58:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-04-20 23:31:51 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
DWORD
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
GetAndSetDCDWord(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ UINT u,
|
|
|
|
_In_ DWORD dwIn,
|
|
|
|
_In_ ULONG ulMFId,
|
|
|
|
_In_ USHORT usMF16Id,
|
|
|
|
_In_ DWORD dwError)
|
2007-04-20 23:31:51 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
DWORD dwResult;
|
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
/* This is a special API, handle it appropriately */
|
|
|
|
HANDLE_METADC2(DWORD, GetAndSetDCDWord, hdc, u, dwIn, ulMFId, usMF16Id, dwError);
|
2014-10-27 23:37:05 +00:00
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
/* Call win32k to do the real work */
|
2014-10-27 23:37:05 +00:00
|
|
|
if (!NtGdiGetAndSetDCDword(hdc, u, dwIn, &dwResult))
|
|
|
|
{
|
2014-12-29 14:25:30 +00:00
|
|
|
return dwError;
|
2014-10-27 23:37:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return dwResult;
|
2007-04-20 23:31:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2006-12-28 22:36:53 +00:00
|
|
|
DWORD
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
GetDCDWord(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ UINT u,
|
|
|
|
_In_ DWORD dwError)
|
2006-12-28 22:36:53 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
DWORD dwResult;
|
|
|
|
|
|
|
|
if (!NtGdiGetDCDword(hdc, u, &dwResult))
|
|
|
|
{
|
|
|
|
return dwError;
|
|
|
|
}
|
|
|
|
|
|
|
|
return dwResult;
|
2006-12-28 22:36:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
Implement GdiReleaseLocalDC, GdiFlush, GdiPlayDCScript, GdiPlayJournal, GdiPlayScript, GdiConvertBitmap, GdiConvertBrush, GdiConvertDC, GdiConvertFont, GdiSetAttrs
Redirect GdiConsoleTextOut, FontIsLinked, GdiDescribePixelFormat, GdiSetPixelFormat, GdiSwapBuffers, GdiFullscreenControl, GdiQueryFonts, GdiInitSpool to win32k.sys
do not redirect add smaller code in gdi32 and use share memory : GdiGradientFill, FrameRgn, GdiTransparentBlt
stub : GdiPrinterThunk, GdiConvertBitmapV5
update good api list.
svn path=/trunk/; revision=28676
2007-08-30 18:06:35 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2007-08-07 05:58:29 +00:00
|
|
|
BOOL
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2007-08-07 05:58:29 +00:00
|
|
|
GetAspectRatioFilterEx(
|
2010-12-27 16:23:59 +00:00
|
|
|
HDC hdc,
|
2014-10-27 23:37:05 +00:00
|
|
|
LPSIZE lpAspectRatio)
|
2007-08-07 05:58:29 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
return NtGdiGetDCPoint(hdc, GdiGetAspectRatioFilter, (PPOINTL)lpAspectRatio );
|
2007-08-07 05:58:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-03-09 23:21:56 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
2007-08-07 05:58:29 +00:00
|
|
|
*/
|
2014-10-28 21:09:01 +00:00
|
|
|
UINT
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-28 21:09:01 +00:00
|
|
|
GetBoundsRect(
|
|
|
|
HDC hdc,
|
|
|
|
LPRECT lprcBounds,
|
|
|
|
UINT flags
|
|
|
|
)
|
2007-08-07 05:58:29 +00:00
|
|
|
{
|
2016-12-22 17:34:58 +00:00
|
|
|
return NtGdiGetBoundsRect(hdc,lprcBounds,flags & ~DCB_WINDOWMGR);
|
2007-08-07 05:58:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2014-10-28 21:09:01 +00:00
|
|
|
UINT
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-28 21:09:01 +00:00
|
|
|
SetBoundsRect(HDC hdc,
|
|
|
|
CONST RECT *prc,
|
|
|
|
UINT flags)
|
2004-03-09 23:21:56 +00:00
|
|
|
{
|
2014-10-28 21:09:01 +00:00
|
|
|
/* FIXME add check for validate the flags */
|
2016-12-22 17:34:58 +00:00
|
|
|
return NtGdiSetBoundsRect(hdc, (LPRECT)prc, flags & ~DCB_WINDOWMGR);
|
2012-04-23 19:22:17 +00:00
|
|
|
}
|
2007-04-21 21:56:29 +00:00
|
|
|
|
2004-03-23 19:46:50 +00:00
|
|
|
|
|
|
|
/*
|
2007-04-23 14:31:08 +00:00
|
|
|
* @implemented
|
2014-10-28 21:09:01 +00:00
|
|
|
*
|
2004-03-23 19:46:50 +00:00
|
|
|
*/
|
2007-10-19 23:21:45 +00:00
|
|
|
int
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-28 21:09:01 +00:00
|
|
|
GetClipBox(HDC hdc,
|
|
|
|
LPRECT lprc)
|
2004-03-23 19:46:50 +00:00
|
|
|
{
|
2014-12-29 14:25:30 +00:00
|
|
|
return NtGdiGetAppClipBox(hdc, lprc);
|
2004-03-23 19:46:50 +00:00
|
|
|
}
|
2004-04-25 14:46:54 +00:00
|
|
|
|
|
|
|
|
2004-04-25 20:05:30 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2007-10-19 23:21:45 +00:00
|
|
|
COLORREF
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2004-04-25 20:05:30 +00:00
|
|
|
GetDCBrushColor(
|
2014-10-27 23:37:05 +00:00
|
|
|
_In_ HDC hdc)
|
2004-04-25 20:05:30 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
|
|
|
|
/* Get the DC attribute */
|
2014-10-28 00:55:22 +00:00
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
2014-10-27 23:37:05 +00:00
|
|
|
return CLR_INVALID;
|
2014-10-28 00:55:22 +00:00
|
|
|
}
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
return pdcattr->ulBrushClr;
|
2004-04-25 20:05:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2007-10-19 23:21:45 +00:00
|
|
|
COLORREF
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2004-04-25 20:05:30 +00:00
|
|
|
GetDCPenColor(
|
2014-10-27 23:37:05 +00:00
|
|
|
_In_ HDC hdc)
|
2004-04-25 20:05:30 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
|
2014-10-28 00:55:22 +00:00
|
|
|
/* Get the DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
2014-10-27 23:37:05 +00:00
|
|
|
return CLR_INVALID;
|
2014-10-28 00:55:22 +00:00
|
|
|
}
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
return pdcattr->ulPenClr;
|
2004-04-25 20:05:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2007-10-19 23:21:45 +00:00
|
|
|
COLORREF
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2004-04-25 20:05:30 +00:00
|
|
|
SetDCBrushColor(
|
2014-10-27 23:37:05 +00:00
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ COLORREF crColor)
|
2004-04-25 20:05:30 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
COLORREF crOldColor;
|
2007-08-04 07:37:27 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
/* Get the DC attribute */
|
2014-10-28 00:55:22 +00:00
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
2014-10-27 23:37:05 +00:00
|
|
|
return CLR_INVALID;
|
2014-10-28 00:55:22 +00:00
|
|
|
}
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
/* We handle only enhanced meta DCs here */
|
|
|
|
HANDLE_METADC(COLORREF, SetDCBrushColor, CLR_INVALID, hdc, crColor);
|
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
/* Get old color and store the new */
|
|
|
|
crOldColor = pdcattr->ulBrushClr;
|
|
|
|
pdcattr->ulBrushClr = crColor;
|
|
|
|
|
|
|
|
if (pdcattr->crBrushClr != crColor)
|
|
|
|
{
|
|
|
|
pdcattr->ulDirty_ |= DIRTY_FILL;
|
|
|
|
pdcattr->crBrushClr = crColor;
|
2007-08-04 07:37:27 +00:00
|
|
|
}
|
2014-10-27 23:37:05 +00:00
|
|
|
|
|
|
|
return crOldColor;
|
2004-04-25 20:05:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2007-10-19 23:21:45 +00:00
|
|
|
COLORREF
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2004-04-25 20:05:30 +00:00
|
|
|
SetDCPenColor(
|
2012-04-23 21:22:12 +00:00
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ COLORREF crColor)
|
2004-04-25 20:05:30 +00:00
|
|
|
{
|
2012-04-23 21:22:12 +00:00
|
|
|
PDC_ATTR pdcattr;
|
2014-10-27 23:37:05 +00:00
|
|
|
COLORREF crOldColor;
|
2007-08-04 07:37:27 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
/* Get the DC attribute */
|
2012-04-23 21:22:12 +00:00
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
2014-10-27 23:37:05 +00:00
|
|
|
if (pdcattr == NULL)
|
2007-08-04 07:37:27 +00:00
|
|
|
{
|
2012-04-23 21:22:12 +00:00
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return CLR_INVALID;
|
|
|
|
}
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
/* We handle only enhanced meta DCs here */
|
|
|
|
HANDLE_METADC(COLORREF, SetDCPenColor, CLR_INVALID, hdc, crColor);
|
|
|
|
|
2012-04-23 21:22:12 +00:00
|
|
|
/* Get old color and store the new */
|
2014-10-27 23:37:05 +00:00
|
|
|
crOldColor = pdcattr->ulPenClr;
|
2012-04-23 21:22:12 +00:00
|
|
|
pdcattr->ulPenClr = (ULONG)crColor;
|
|
|
|
|
|
|
|
if (pdcattr->crPenClr != crColor)
|
|
|
|
{
|
|
|
|
pdcattr->ulDirty_ |= DIRTY_LINE;
|
|
|
|
pdcattr->crPenClr = crColor;
|
2007-08-04 07:37:27 +00:00
|
|
|
}
|
2012-04-23 21:22:12 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
return crOldColor;
|
2007-11-20 19:56:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
COLORREF
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
GetBkColor(
|
|
|
|
_In_ HDC hdc)
|
2007-11-20 19:56:57 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
|
|
|
|
/* Get the DC attribute */
|
2014-10-28 00:55:22 +00:00
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
/* Don't set LastError here! */
|
|
|
|
return CLR_INVALID;
|
|
|
|
}
|
2014-10-27 23:37:05 +00:00
|
|
|
|
|
|
|
return pdcattr->ulBackgroundClr;
|
2004-04-25 20:05:30 +00:00
|
|
|
}
|
2004-12-30 02:32:24 +00:00
|
|
|
|
2007-09-03 03:43:21 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2007-10-19 23:21:45 +00:00
|
|
|
COLORREF
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2007-11-20 19:56:57 +00:00
|
|
|
SetBkColor(
|
2014-10-27 23:37:05 +00:00
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ COLORREF crColor)
|
2007-09-03 03:43:21 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
COLORREF crOldColor;
|
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
HANDLE_METADC(COLORREF, SetBkColor, CLR_INVALID, hdc, crColor);
|
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
/* Get the DC attribute */
|
2014-10-28 00:55:22 +00:00
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
2014-10-27 23:37:05 +00:00
|
|
|
return CLR_INVALID;
|
2014-10-28 00:55:22 +00:00
|
|
|
}
|
2007-09-03 03:43:21 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
/* Get old color and store the new */
|
|
|
|
crOldColor = pdcattr->ulBackgroundClr;
|
|
|
|
pdcattr->ulBackgroundClr = crColor;
|
|
|
|
|
|
|
|
if (pdcattr->crBackgroundClr != crColor)
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
pdcattr->ulDirty_ |= (DIRTY_BACKGROUND|DIRTY_LINE|DIRTY_FILL);
|
|
|
|
pdcattr->crBackgroundClr = crColor;
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
2014-10-27 23:37:05 +00:00
|
|
|
|
|
|
|
return crOldColor;
|
2007-09-03 03:43:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
2007-11-20 19:56:57 +00:00
|
|
|
*
|
2007-09-03 03:43:21 +00:00
|
|
|
*/
|
2007-11-20 19:56:57 +00:00
|
|
|
int
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2007-11-20 19:56:57 +00:00
|
|
|
GetBkMode(HDC hdc)
|
2007-09-03 03:43:21 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
|
|
|
|
/* Get the DC attribute */
|
2014-10-28 00:55:22 +00:00
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
/* Don't set LastError here! */
|
2014-10-27 23:37:05 +00:00
|
|
|
return 0;
|
2014-10-28 00:55:22 +00:00
|
|
|
}
|
2014-10-27 23:37:05 +00:00
|
|
|
|
|
|
|
return pdcattr->lBkMode;
|
2007-11-20 19:56:57 +00:00
|
|
|
}
|
2007-09-03 03:43:21 +00:00
|
|
|
|
2007-11-20 19:56:57 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
SetBkMode(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ int iBkMode)
|
2007-11-20 19:56:57 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
INT iOldMode;
|
2007-11-20 19:56:57 +00:00
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
HANDLE_METADC(INT, SetBkMode, 0, hdc, iBkMode);
|
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
/* Get the DC attribute */
|
2014-10-28 00:55:22 +00:00
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
2014-10-27 23:37:05 +00:00
|
|
|
return 0;
|
2014-10-28 00:55:22 +00:00
|
|
|
}
|
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
iOldMode = pdcattr->lBkMode;
|
|
|
|
pdcattr->jBkMode = iBkMode; // Processed
|
|
|
|
pdcattr->lBkMode = iBkMode; // Raw
|
|
|
|
|
|
|
|
return iOldMode;
|
2007-09-03 03:43:21 +00:00
|
|
|
}
|
2004-12-30 02:32:24 +00:00
|
|
|
|
2014-12-29 13:11:27 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
WINAPI
|
2014-12-29 13:11:40 +00:00
|
|
|
GetROP2(
|
|
|
|
_In_ HDC hdc)
|
2014-12-29 13:11:27 +00:00
|
|
|
{
|
2014-12-29 13:11:40 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
|
|
|
|
/* Get the DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
/* Do not set LastError here! */
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pdcattr->jROP2;
|
2014-12-29 13:11:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
WINAPI
|
2014-12-29 13:11:40 +00:00
|
|
|
SetROP2(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ int rop2)
|
2014-12-29 13:11:27 +00:00
|
|
|
{
|
2014-12-29 13:11:40 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
INT rop2Old;
|
2014-12-29 13:11:27 +00:00
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
HANDLE_METADC(INT, SetROP2, 0, hdc, rop2);
|
2014-12-29 13:11:40 +00:00
|
|
|
|
|
|
|
/* Get the DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return 0;
|
|
|
|
}
|
2014-12-29 13:11:27 +00:00
|
|
|
|
|
|
|
if (NtCurrentTeb()->GdiTebBatch.HDC == hdc)
|
|
|
|
{
|
2014-12-29 13:11:40 +00:00
|
|
|
if (pdcattr->ulDirty_ & DC_MODE_DIRTY)
|
2014-12-29 13:11:27 +00:00
|
|
|
{
|
|
|
|
NtGdiFlush();
|
2014-12-29 13:11:40 +00:00
|
|
|
pdcattr->ulDirty_ &= ~DC_MODE_DIRTY;
|
2014-12-29 13:11:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-29 13:11:40 +00:00
|
|
|
rop2Old = pdcattr->jROP2;
|
|
|
|
pdcattr->jROP2 = (BYTE)rop2;
|
2014-12-29 13:11:27 +00:00
|
|
|
|
2014-12-29 13:11:40 +00:00
|
|
|
return rop2Old;
|
2014-12-29 13:11:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-11-27 01:01:39 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2007-11-27 01:01:39 +00:00
|
|
|
GetPolyFillMode(HDC hdc)
|
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
|
|
|
|
/* Get DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
2014-10-28 00:55:22 +00:00
|
|
|
/* Don't set LastError here! */
|
2014-10-27 23:37:05 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return current fill mode */
|
|
|
|
return pdcattr->lFillMode;
|
2007-11-27 01:01:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
int
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
SetPolyFillMode(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ int iPolyFillMode)
|
2007-11-27 01:01:39 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
INT iOldPolyFillMode;
|
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
HANDLE_METADC(INT, SetPolyFillMode, 0, hdc, iPolyFillMode);
|
2014-10-27 23:37:05 +00:00
|
|
|
|
2014-10-28 00:55:22 +00:00
|
|
|
/* Get the DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
2014-10-27 23:37:05 +00:00
|
|
|
{
|
2014-10-28 00:55:22 +00:00
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
2014-10-27 23:37:05 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2007-11-27 01:01:39 +00:00
|
|
|
|
2010-12-27 16:23:59 +00:00
|
|
|
if (NtCurrentTeb()->GdiTebBatch.HDC == hdc)
|
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
if (pdcattr->ulDirty_ & DC_MODE_DIRTY)
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
NtGdiFlush(); // Sync up pdcattr from Kernel space.
|
|
|
|
pdcattr->ulDirty_ &= ~(DC_MODE_DIRTY|DC_FONTTEXT_DIRTY);
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
|
|
|
}
|
2007-11-27 01:01:39 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
iOldPolyFillMode = pdcattr->lFillMode;
|
|
|
|
pdcattr->lFillMode = iPolyFillMode;
|
2007-11-27 01:01:39 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
return iOldPolyFillMode;
|
2007-11-27 01:01:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2007-11-27 01:01:39 +00:00
|
|
|
GetGraphicsMode(HDC hdc)
|
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
|
2014-10-28 00:55:22 +00:00
|
|
|
/* Get the DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
2014-10-27 23:37:05 +00:00
|
|
|
{
|
2014-10-28 00:55:22 +00:00
|
|
|
/* Don't set LastError here! */
|
2014-10-27 23:37:05 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return current graphics mode */
|
|
|
|
return pdcattr->iGraphicsMode;
|
2007-11-27 01:01:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
int
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
SetGraphicsMode(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ int iMode)
|
2007-11-27 01:01:39 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
INT iOldMode;
|
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
|
|
|
|
/* Check parameters */
|
2010-12-27 16:23:59 +00:00
|
|
|
if ((iMode < GM_COMPATIBLE) || (iMode > GM_ADVANCED))
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return 0;
|
|
|
|
}
|
2007-11-27 01:01:39 +00:00
|
|
|
|
2014-10-28 00:55:22 +00:00
|
|
|
/* Get the DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
2014-10-27 23:37:05 +00:00
|
|
|
{
|
2014-10-28 00:55:22 +00:00
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
2014-10-27 23:37:05 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for trivial case */
|
|
|
|
if (iMode == pdcattr->iGraphicsMode)
|
|
|
|
return iMode;
|
2010-12-27 16:23:59 +00:00
|
|
|
|
|
|
|
if (NtCurrentTeb()->GdiTebBatch.HDC == hdc)
|
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
if (pdcattr->ulDirty_ & DC_MODE_DIRTY)
|
2010-12-27 16:23:59 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
NtGdiFlush(); // Sync up pdcattr from Kernel space.
|
|
|
|
pdcattr->ulDirty_ &= ~(DC_MODE_DIRTY|DC_FONTTEXT_DIRTY);
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
|
|
|
}
|
2014-10-27 23:37:05 +00:00
|
|
|
|
2010-12-27 16:23:59 +00:00
|
|
|
/* One would think that setting the graphics mode to GM_COMPATIBLE
|
|
|
|
* would also reset the world transformation matrix to the unity
|
|
|
|
* matrix. However, in Windows, this is not the case. This doesn't
|
|
|
|
* make a lot of sense to me, but that's the way it is.
|
|
|
|
*/
|
2014-10-27 23:37:05 +00:00
|
|
|
iOldMode = pdcattr->iGraphicsMode;
|
|
|
|
pdcattr->iGraphicsMode = iMode;
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
return iOldMode;
|
2007-11-27 01:01:39 +00:00
|
|
|
}
|
|
|
|
|
2004-12-30 02:32:24 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
HDC
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2004-12-30 02:32:24 +00:00
|
|
|
ResetDCW(
|
2014-10-27 23:37:05 +00:00
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ CONST DEVMODEW *lpInitData)
|
2004-12-30 02:32:24 +00:00
|
|
|
{
|
2010-12-27 16:23:59 +00:00
|
|
|
NtGdiResetDC ( hdc, (PDEVMODEW)lpInitData, NULL, NULL, NULL);
|
|
|
|
return hdc;
|
2004-12-30 02:32:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
HDC
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2004-12-30 02:32:24 +00:00
|
|
|
ResetDCA(
|
2014-10-27 23:37:05 +00:00
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ CONST DEVMODEA *lpInitData)
|
2004-12-30 02:32:24 +00:00
|
|
|
{
|
2010-12-27 16:23:59 +00:00
|
|
|
LPDEVMODEW InitDataW;
|
2004-12-30 02:32:24 +00:00
|
|
|
|
2010-12-27 16:23:59 +00:00
|
|
|
InitDataW = GdiConvertToDevmodeW((LPDEVMODEA)lpInitData);
|
2004-12-30 02:32:24 +00:00
|
|
|
|
2010-12-27 16:23:59 +00:00
|
|
|
NtGdiResetDC ( hdc, InitDataW, NULL, NULL, NULL);
|
|
|
|
HEAP_free(InitDataW);
|
|
|
|
return hdc;
|
2004-12-30 02:32:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-19 23:49:47 +00:00
|
|
|
/* FIXME: include correct header */
|
2008-11-30 11:42:05 +00:00
|
|
|
HPALETTE WINAPI NtUserSelectPalette(HDC hDC,
|
2010-12-27 16:23:59 +00:00
|
|
|
HPALETTE hpal,
|
|
|
|
BOOL ForceBackground);
|
2007-08-19 23:49:47 +00:00
|
|
|
|
|
|
|
HPALETTE
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2007-08-19 23:49:47 +00:00
|
|
|
SelectPalette(
|
2014-10-27 23:37:05 +00:00
|
|
|
HDC hdc,
|
|
|
|
HPALETTE hpal,
|
2007-08-19 23:49:47 +00:00
|
|
|
BOOL bForceBackground)
|
|
|
|
{
|
2014-12-29 14:25:30 +00:00
|
|
|
HANDLE_METADC(HPALETTE, SelectPalette, NULL, hdc, hpal, bForceBackground);
|
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
return NtUserSelectPalette(hdc, hpal, bForceBackground);
|
2007-08-19 23:49:47 +00:00
|
|
|
}
|
2007-08-21 09:28:51 +00:00
|
|
|
|
2012-04-23 21:22:12 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
WINAPI
|
|
|
|
GetStretchBltMode(HDC hdc)
|
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
|
|
|
|
/* Get the DC attribute */
|
2014-10-28 00:55:22 +00:00
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
/* Don't set LastError here! */
|
2014-10-27 23:37:05 +00:00
|
|
|
return 0;
|
2014-10-28 00:55:22 +00:00
|
|
|
}
|
2014-10-27 23:37:05 +00:00
|
|
|
|
|
|
|
return pdcattr->lStretchBltMode;
|
2012-04-23 21:22:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
WINAPI
|
2014-10-27 23:37:05 +00:00
|
|
|
SetStretchBltMode(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ int iStretchMode)
|
2012-04-23 21:22:12 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
INT iOldMode;
|
|
|
|
PDC_ATTR pdcattr;
|
2014-12-29 14:25:30 +00:00
|
|
|
|
|
|
|
HANDLE_METADC(INT, SetStretchBltMode, 0, hdc, iStretchMode);
|
|
|
|
|
2014-10-28 00:55:22 +00:00
|
|
|
/* Get the DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
|
|
|
{
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
2014-10-27 23:37:05 +00:00
|
|
|
return 0;
|
2014-10-28 00:55:22 +00:00
|
|
|
}
|
2007-11-28 07:52:51 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
iOldMode = pdcattr->lStretchBltMode;
|
|
|
|
pdcattr->lStretchBltMode = iStretchMode;
|
2007-11-28 07:52:51 +00:00
|
|
|
|
2012-04-23 21:22:12 +00:00
|
|
|
// Wine returns an error here. We set the default.
|
|
|
|
if ((iStretchMode <= 0) || (iStretchMode > MAXSTRETCHBLTMODE)) iStretchMode = WHITEONBLACK;
|
2007-08-21 09:28:51 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
pdcattr->jStretchBltMode = iStretchMode;
|
2007-11-30 02:14:58 +00:00
|
|
|
|
2014-10-27 23:37:05 +00:00
|
|
|
return iOldMode;
|
2012-04-23 21:22:12 +00:00
|
|
|
}
|
2007-11-30 02:14:58 +00:00
|
|
|
|
2012-04-23 21:22:12 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
|
|
|
HFONT
|
|
|
|
WINAPI
|
|
|
|
GetHFONT(HDC hdc)
|
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
|
|
|
|
/* Get the DC attribute */
|
2014-10-28 00:55:22 +00:00
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
2014-10-27 23:37:05 +00:00
|
|
|
{
|
2014-10-28 00:55:22 +00:00
|
|
|
/* Don't set LastError here! */
|
2014-10-27 23:37:05 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return the current font */
|
|
|
|
return pdcattr->hlfntNew;
|
2012-04-23 21:22:12 +00:00
|
|
|
}
|
2007-11-30 02:14:58 +00:00
|
|
|
|
|
|
|
|
2014-10-28 21:09:01 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
HBITMAP
|
2012-04-23 21:22:12 +00:00
|
|
|
WINAPI
|
2014-10-28 09:06:33 +00:00
|
|
|
GdiSelectBitmap(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ HBITMAP hbmp)
|
|
|
|
{
|
|
|
|
return NtGdiSelectBitmap(hdc, hbmp);
|
|
|
|
}
|
|
|
|
|
|
|
|
HBRUSH
|
|
|
|
WINAPI
|
|
|
|
GdiSelectBrush(
|
2014-10-27 23:37:05 +00:00
|
|
|
_In_ HDC hdc,
|
2014-10-28 09:06:33 +00:00
|
|
|
_In_ HBRUSH hbr)
|
2012-04-23 21:22:12 +00:00
|
|
|
{
|
2014-10-27 23:37:05 +00:00
|
|
|
PDC_ATTR pdcattr;
|
2014-10-28 09:06:33 +00:00
|
|
|
HBRUSH hbrOld;
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
HANDLE_METADC(HBRUSH, SelectBrush, NULL, hdc, hbr);
|
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
/* Get the DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
2012-04-23 21:22:12 +00:00
|
|
|
{
|
2014-10-28 09:06:33 +00:00
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
2012-04-23 21:22:12 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
/* Get the current brush. If it matches the new brush, we're done */
|
|
|
|
hbrOld = pdcattr->hbrush;
|
|
|
|
if (hbrOld == hbr)
|
|
|
|
return hbrOld;
|
|
|
|
|
|
|
|
/* Set the new brush and update dirty flags */
|
|
|
|
pdcattr->hbrush = hbr;
|
|
|
|
pdcattr->ulDirty_ |= DC_BRUSH_DIRTY;
|
|
|
|
return hbrOld;
|
|
|
|
}
|
|
|
|
|
|
|
|
HPEN
|
|
|
|
WINAPI
|
|
|
|
GdiSelectPen(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ HPEN hpen)
|
|
|
|
{
|
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
HPEN hpenOld;
|
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
HANDLE_METADC(HPEN, SelectPen, NULL, hdc, hpen);
|
|
|
|
|
2014-10-28 00:55:22 +00:00
|
|
|
/* Get the DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
2012-04-23 21:22:12 +00:00
|
|
|
{
|
2017-04-27 08:59:29 +00:00
|
|
|
SetLastError(ERROR_INVALID_HANDLE);
|
2012-04-23 21:22:12 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
/* Get the current pen. If it matches the new pen, we're done */
|
|
|
|
hpenOld = pdcattr->hpen;
|
|
|
|
if (hpenOld == hpen)
|
|
|
|
return hpenOld;
|
|
|
|
|
|
|
|
/* Set the new pen and update dirty flags */
|
|
|
|
pdcattr->ulDirty_ |= DC_PEN_DIRTY;
|
|
|
|
pdcattr->hpen = hpen;
|
|
|
|
return hpenOld;
|
|
|
|
}
|
2010-12-27 16:23:59 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
HFONT
|
|
|
|
WINAPI
|
|
|
|
GdiSelectFont(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ HFONT hfont)
|
|
|
|
{
|
|
|
|
PDC_ATTR pdcattr;
|
|
|
|
HFONT hfontOld;
|
|
|
|
|
2014-12-29 14:25:30 +00:00
|
|
|
HANDLE_METADC(HFONT, SelectFont, NULL, hdc, hfont);
|
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
/* Get the DC attribute */
|
|
|
|
pdcattr = GdiGetDcAttr(hdc);
|
|
|
|
if (pdcattr == NULL)
|
2012-04-23 21:22:12 +00:00
|
|
|
{
|
2014-10-28 09:06:33 +00:00
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return NULL;
|
|
|
|
}
|
2007-11-30 02:14:58 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
/* Get the current font. If it matches the new font, we're done */
|
|
|
|
hfontOld = pdcattr->hlfntNew;
|
|
|
|
if (hfontOld == hfont)
|
|
|
|
return hfontOld;
|
2007-11-30 02:14:58 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
/* Set the new font and update dirty flags */
|
|
|
|
pdcattr->hlfntNew = hfont;
|
|
|
|
pdcattr->ulDirty_ &= ~SLOW_WIDTHS;
|
|
|
|
pdcattr->ulDirty_ |= DIRTY_CHARSET;
|
2007-11-30 02:14:58 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
/* If the DC does not have a DIB section selected, try a batch command */
|
|
|
|
if (!(pdcattr->ulDirty_ & DC_DIBSECTION))
|
|
|
|
{
|
|
|
|
PGDIBSOBJECT pgO;
|
2007-11-30 02:14:58 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
pgO = GdiAllocBatchCommand(hdc, GdiBCSelObj);
|
|
|
|
if (pgO)
|
|
|
|
{
|
|
|
|
pgO->hgdiobj = hfont;
|
|
|
|
return hfontOld;
|
|
|
|
}
|
|
|
|
}
|
2010-05-01 13:02:46 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
/* We could not use the batch command, call win32k */
|
|
|
|
return NtGdiSelectFont(hdc, hfont);
|
|
|
|
}
|
2010-05-01 13:02:46 +00:00
|
|
|
|
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
HGDIOBJ
|
|
|
|
WINAPI
|
|
|
|
SelectObject(
|
|
|
|
_In_ HDC hdc,
|
|
|
|
_In_ HGDIOBJ hobj)
|
|
|
|
{
|
|
|
|
/* Fix up 16 bit handles */
|
|
|
|
hobj = GdiFixUpHandle(hobj);
|
2017-10-01 07:53:54 +00:00
|
|
|
if (!GdiValidateHandle(hobj))
|
2014-10-28 09:06:33 +00:00
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
2010-05-01 13:02:46 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
/* Call the appropriate select function */
|
|
|
|
switch (GDI_HANDLE_GET_TYPE(hobj))
|
|
|
|
{
|
|
|
|
case GDILoObjType_LO_REGION_TYPE:
|
|
|
|
return (HGDIOBJ)ExtSelectClipRgn(hdc, hobj, RGN_COPY);
|
2008-11-03 05:38:02 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
case GDILoObjType_LO_BITMAP_TYPE:
|
|
|
|
case GDILoObjType_LO_DIBSECTION_TYPE:
|
|
|
|
return GdiSelectBitmap(hdc, hobj);
|
2007-11-30 02:14:58 +00:00
|
|
|
|
2014-10-28 09:06:33 +00:00
|
|
|
case GDILoObjType_LO_BRUSH_TYPE:
|
|
|
|
return GdiSelectBrush(hdc, hobj);
|
|
|
|
|
|
|
|
case GDILoObjType_LO_PEN_TYPE:
|
|
|
|
case GDILoObjType_LO_EXTPEN_TYPE:
|
|
|
|
return GdiSelectPen(hdc, hobj);
|
|
|
|
|
|
|
|
case GDILoObjType_LO_FONT_TYPE:
|
|
|
|
return GdiSelectFont(hdc, hobj);
|
|
|
|
|
|
|
|
case GDILoObjType_LO_ICMLCS_TYPE:
|
|
|
|
return SetColorSpace(hdc, hobj);
|
|
|
|
|
|
|
|
case GDILoObjType_LO_PALETTE_TYPE:
|
2007-12-01 02:14:35 +00:00
|
|
|
SetLastError(ERROR_INVALID_FUNCTION);
|
2014-10-28 09:06:33 +00:00
|
|
|
|
2012-04-23 21:22:12 +00:00
|
|
|
default:
|
2007-12-01 02:14:35 +00:00
|
|
|
return NULL;
|
2010-12-27 16:23:59 +00:00
|
|
|
}
|
2012-04-23 21:22:12 +00:00
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
2014-10-28 21:09:01 +00:00
|
|
|
|
2017-06-16 18:38:08 +00:00
|
|
|
/***********************************************************************
|
|
|
|
* D3DKMTCreateDCFromMemory (GDI32.@)
|
|
|
|
*/
|
|
|
|
DWORD WINAPI D3DKMTCreateDCFromMemory( D3DKMT_CREATEDCFROMMEMORY *desc )
|
|
|
|
{
|
|
|
|
return NtGdiDdDDICreateDCFromMemory( desc );
|
|
|
|
}
|
|
|
|
|
|
|
|
DWORD WINAPI D3DKMTDestroyDCFromMemory( const D3DKMT_DESTROYDCFROMMEMORY *desc )
|
|
|
|
{
|
|
|
|
return NtGdiDdDDIDestroyDCFromMemory( desc );
|
|
|
|
}
|