In Escape() make use of GdiGetDcAttr(), GreatLordish -> English and fix copy-pasta in comments, improve formatting, remove some code that (attention euphemism) wasn't exactly correct.

svn path=/trunk/; revision=65889
This commit is contained in:
Timo Kreuzer 2014-12-29 13:12:29 +00:00
parent c8bc34b358
commit 503848e61e

View file

@ -50,33 +50,35 @@ GdiFlush()
/* /*
* @unimplemented * @unimplemented
*/ */
int INT
WINAPI WINAPI
Escape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpvInData, LPVOID lpvOutData) Escape(
_In_ HDC hdc,
_In_ INT nEscape,
_In_ INT cbInput,
_In_ LPCSTR lpvInData,
_Out_ LPVOID lpvOutData)
{ {
int retValue = SP_ERROR; INT retValue = SP_ERROR;
HGDIOBJ hObject = hdc; ULONG ulObjType;
UINT Type = 0;
LPVOID pUserData = NULL;
Type = GDI_HANDLE_GET_TYPE(hObject); ulObjType = GDI_HANDLE_GET_TYPE(hdc);
if (Type == GDI_OBJECT_TYPE_METADC) if (ulObjType == GDILoObjType_LO_METADC16_TYPE)
{ {
/* FIXME we do not support metafile */ /* FIXME we do not support metafile */
UNIMPLEMENTED; UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return SP_ERROR;
} }
else
switch (nEscape)
{ {
switch (nEscape)
{
case ABORTDOC: case ABORTDOC:
/* Note Winodws check see if the handle have any user data for ABORTDOC command /* Note: Windows checks if the handle has any user data for the ABORTDOC command
* ReactOS copy this behavior to be compatible with windows 2003 * ReactOS copies this behavior to be compatible with windows 2003
*/ */
if ( (!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &pUserData)) || if (GdiGetDcAttr(hdc) == NULL)
(pUserData == NULL) )
{ {
GdiSetLastError(ERROR_INVALID_HANDLE); GdiSetLastError(ERROR_INVALID_HANDLE);
retValue = FALSE; retValue = FALSE;
@ -90,12 +92,11 @@ Escape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpvInData, LPVOID lpvOutData)
case DRAFTMODE: case DRAFTMODE:
case FLUSHOUTPUT: case FLUSHOUTPUT:
case SETCOLORTABLE: case SETCOLORTABLE:
/* Note 1: DRAFTMODE, FLUSHOUTPUT, SETCOLORTABLE is outdated and been replace with other api */ /* Note 1: DRAFTMODE, FLUSHOUTPUT, SETCOLORTABLE are outdated */
/* Note 2: Winodws check see if the handle have any user data for DRAFTMODE, FLUSHOUTPUT, SETCOLORTABLE command /* Note 2: Windows checks if the handle has any user data for the DRAFTMODE, FLUSHOUTPUT, SETCOLORTABLE commands
* ReactOS copy this behavior to be compatible with windows 2003 * ReactOS copies this behavior to be compatible with windows 2003
*/ */
if ( (!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &pUserData)) || if (GdiGetDcAttr(hdc) == NULL)
(pUserData == NULL) )
{ {
GdiSetLastError(ERROR_INVALID_HANDLE); GdiSetLastError(ERROR_INVALID_HANDLE);
} }
@ -103,11 +104,10 @@ Escape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpvInData, LPVOID lpvOutData)
break; break;
case SETABORTPROC: case SETABORTPROC:
/* Note : Winodws check see if the handle have any user data for DRAFTMODE, FLUSHOUTPUT, SETCOLORTABLE command /* Note: Windows checks if the handle has any user data for the SETABORTPROC command
* ReactOS copy this behavior to be compatible with windows 2003 * ReactOS copies this behavior to be compatible with windows 2003
*/ */
if ( (!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &pUserData)) || if (GdiGetDcAttr(hdc) == NULL)
(pUserData == NULL) )
{ {
GdiSetLastError(ERROR_INVALID_HANDLE); GdiSetLastError(ERROR_INVALID_HANDLE);
retValue = FALSE; retValue = FALSE;
@ -117,18 +117,17 @@ Escape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpvInData, LPVOID lpvOutData)
case GETCOLORTABLE: case GETCOLORTABLE:
retValue = GetSystemPaletteEntries(hdc, (UINT)*lpvInData, 1, (LPPALETTEENTRY)lpvOutData); retValue = GetSystemPaletteEntries(hdc, (UINT)*lpvInData, 1, (LPPALETTEENTRY)lpvOutData);
if ( !retValue ) if (!retValue)
{ {
retValue = SP_ERROR; retValue = SP_ERROR;
} }
break; break;
case ENDDOC: case ENDDOC:
/* Note : Winodws check see if the handle have any user data for DRAFTMODE, FLUSHOUTPUT, SETCOLORTABLE command /* Note: Windows checks if the handle has any user data for the ENDDOC command
* ReactOS copy this behavior to be compatible with windows 2003 * ReactOS copies this behavior to be compatible with windows 2003
*/ */
if ( (!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &pUserData)) || if (GdiGetDcAttr(hdc) == NULL)
(pUserData == NULL) )
{ {
GdiSetLastError(ERROR_INVALID_HANDLE); GdiSetLastError(ERROR_INVALID_HANDLE);
retValue = FALSE; retValue = FALSE;
@ -136,14 +135,13 @@ Escape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpvInData, LPVOID lpvOutData)
retValue = EndDoc(hdc); retValue = EndDoc(hdc);
break; break;
case GETSCALINGFACTOR: case GETSCALINGFACTOR:
/* Note GETSCALINGFACTOR is outdated have been replace by GetDeviceCaps */ /* Note GETSCALINGFACTOR is outdated have been replace by GetDeviceCaps */
if ( Type == GDI_OBJECT_TYPE_DC ) if (ulObjType == GDI_OBJECT_TYPE_DC)
{ {
if ( lpvOutData ) if (lpvOutData)
{ {
PPOINT ptr = (PPOINT) lpvOutData; PPOINT ptr = (PPOINT)lpvOutData;
ptr->x = 0; ptr->x = 0;
ptr->y = 0; ptr->y = 0;
} }
@ -152,46 +150,34 @@ Escape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpvInData, LPVOID lpvOutData)
break; break;
case GETEXTENDEDTEXTMETRICS: case GETEXTENDEDTEXTMETRICS:
retValue = (int) GetETM( hdc, (EXTTEXTMETRIC *) lpvOutData) != 0; retValue = GetETM(hdc, (EXTTEXTMETRIC *)lpvOutData) != 0;
break; break;
case STARTDOC: case STARTDOC:
{ {
DOCINFOA *pUserDatalpdi; DOCINFOA di;
DOCINFOA lpdi;
/* Note : Winodws check see if the handle have any user data for STARTDOC command /* Note: Windows checks if the handle has any user data for the STARTDOC command
* ReactOS copy this behavior to be compatible with windows 2003 * ReactOS copies this behavior to be compatible with windows 2003
*/ */
if ( (!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &pUserDatalpdi)) || if (GdiGetDcAttr(hdc) == NULL)
(pUserData == NULL) )
{ {
GdiSetLastError(ERROR_INVALID_HANDLE); GdiSetLastError(ERROR_INVALID_HANDLE);
retValue = FALSE; retValue = FALSE;
} }
lpdi.cbSize = sizeof(DOCINFOA); di.cbSize = sizeof(DOCINFOA);
di.lpszOutput = 0;
/* NOTE lpszOutput will be store in handle userdata */ di.lpszDatatype = 0;
lpdi.lpszOutput = 0; di.fwType = 0;
di.lpszDocName = lpvInData;
lpdi.lpszDatatype = 0;
lpdi.fwType = 0;
lpdi.lpszDocName = lpvInData;
/* NOTE : doc for StartDocA/W at msdn http://msdn2.microsoft.com/en-us/library/ms535793(VS.85).aspx */ /* NOTE : doc for StartDocA/W at msdn http://msdn2.microsoft.com/en-us/library/ms535793(VS.85).aspx */
retValue = StartDocA(hdc, &lpdi); retValue = StartDocA(hdc, &di);
/* StartDocA fail */ /* Check if StartDocA failed */
if (retValue < 0) if (retValue < 0)
{ {
/* check see if outbuffer contain any data, if it does abort */
if ( (pUserDatalpdi->lpszOutput != 0) &&
( (*(WCHAR *)pUserDatalpdi->lpszOutput) != UNICODE_NULL) )
{
retValue = SP_APPABORT;
}
else
{ {
retValue = GetLastError(); retValue = GetLastError();
@ -221,13 +207,9 @@ Escape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpvInData, LPVOID lpvOutData)
} }
break; break;
default: default:
UNIMPLEMENTED; UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
}
} }
return retValue; return retValue;