2003-05-18 17:16:18 +00:00
|
|
|
/*
|
|
|
|
* ReactOS W32 Subsystem
|
|
|
|
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
2005-01-06 13:58:04 +00:00
|
|
|
/* $Id$
|
2002-07-04 19:56:38 +00:00
|
|
|
*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
|
|
|
* PURPOSE: Coordinate systems
|
|
|
|
* FILE: subsys/win32k/objects/coord.c
|
|
|
|
* PROGRAMER: Unknown
|
|
|
|
*/
|
1999-07-22 16:21:53 +00:00
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
/* INCLUDES ******************************************************************/
|
2005-06-29 07:09:25 +00:00
|
|
|
|
2004-05-10 17:07:20 +00:00
|
|
|
#include <w32k.h>
|
1999-07-22 16:21:53 +00:00
|
|
|
|
2005-06-29 07:09:25 +00:00
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
|
2006-06-21 08:33:27 +00:00
|
|
|
void FASTCALL
|
|
|
|
IntFixIsotropicMapping(PDC dc)
|
|
|
|
{
|
2007-11-26 11:24:48 +00:00
|
|
|
ULONG xdim;
|
|
|
|
ULONG ydim;
|
2007-11-18 13:51:34 +00:00
|
|
|
PDC_ATTR Dc_Attr = dc->pDc_Attr;
|
|
|
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
|
|
|
|
2007-11-26 11:24:48 +00:00
|
|
|
xdim = EngMulDiv(Dc_Attr->szlViewportExt.cx,
|
2007-11-18 13:51:34 +00:00
|
|
|
((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzSize,
|
|
|
|
((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzRes) /
|
|
|
|
Dc_Attr->szlWindowExt.cx;
|
2007-11-26 11:24:48 +00:00
|
|
|
ydim = EngMulDiv(Dc_Attr->szlViewportExt.cy,
|
2007-11-18 13:51:34 +00:00
|
|
|
((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertSize,
|
|
|
|
((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertRes) /
|
|
|
|
Dc_Attr->szlWindowExt.cy;
|
2006-06-21 08:33:27 +00:00
|
|
|
|
|
|
|
if (xdim > ydim)
|
|
|
|
{
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->szlViewportExt.cx = Dc_Attr->szlViewportExt.cx * abs(ydim / xdim);
|
|
|
|
if (!Dc_Attr->szlViewportExt.cx) Dc_Attr->szlViewportExt.cx = 1;
|
2006-06-21 08:33:27 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->szlViewportExt.cy = Dc_Attr->szlViewportExt.cy * abs(xdim / ydim);
|
|
|
|
if (!Dc_Attr->szlViewportExt.cy) Dc_Attr->szlViewportExt.cy = 1;
|
2006-06-21 08:33:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
BOOL FASTCALL
|
|
|
|
IntGdiCombineTransform(LPXFORM XFormResult,
|
|
|
|
LPXFORM xform1,
|
|
|
|
LPXFORM xform2)
|
|
|
|
{
|
|
|
|
/* Check for illegal parameters */
|
|
|
|
if (!XFormResult || !xform1 || !xform2)
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
/* Create the result in a temporary XFORM, since xformResult may be
|
|
|
|
* equal to xform1 or xform2 */
|
|
|
|
XFormResult->eM11 = xform1->eM11 * xform2->eM11 + xform1->eM12 * xform2->eM21;
|
|
|
|
XFormResult->eM12 = xform1->eM11 * xform2->eM12 + xform1->eM12 * xform2->eM22;
|
|
|
|
XFormResult->eM21 = xform1->eM21 * xform2->eM11 + xform1->eM22 * xform2->eM21;
|
|
|
|
XFormResult->eM22 = xform1->eM21 * xform2->eM12 + xform1->eM22 * xform2->eM22;
|
|
|
|
XFormResult->eDx = xform1->eDx * xform2->eM11 + xform1->eDy * xform2->eM21 + xform2->eDx;
|
|
|
|
XFormResult->eDy = xform1->eDx * xform2->eM12 + xform1->eDy * xform2->eM22 + xform2->eDy;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2003-08-19 11:48:50 +00:00
|
|
|
BOOL STDCALL NtGdiCombineTransform(LPXFORM UnsafeXFormResult,
|
2007-11-26 11:24:48 +00:00
|
|
|
LPXFORM Unsafexform1,
|
|
|
|
LPXFORM Unsafexform2)
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
1999-10-28 23:37:14 +00:00
|
|
|
XFORM xformTemp;
|
2005-09-27 10:52:10 +00:00
|
|
|
XFORM xform1 = {0}, xform2 = {0};
|
2005-07-26 12:22:55 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
2007-04-02 15:08:54 +00:00
|
|
|
BOOL Ret;
|
2002-07-13 21:37:27 +00:00
|
|
|
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
2001-03-31 15:35:08 +00:00
|
|
|
{
|
2005-07-26 12:22:55 +00:00
|
|
|
ProbeForWrite(UnsafeXFormResult,
|
|
|
|
sizeof(XFORM),
|
|
|
|
1);
|
|
|
|
ProbeForRead(Unsafexform1,
|
|
|
|
sizeof(XFORM),
|
|
|
|
1);
|
|
|
|
ProbeForRead(Unsafexform2,
|
|
|
|
sizeof(XFORM),
|
|
|
|
1);
|
|
|
|
xform1 = *Unsafexform1;
|
|
|
|
xform2 = *Unsafexform2;
|
2001-03-31 15:35:08 +00:00
|
|
|
}
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
|
|
|
Status = _SEH_GetExceptionCode();
|
|
|
|
}
|
|
|
|
_SEH_END;
|
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
Ret = IntGdiCombineTransform(&xformTemp, &xform1, &xform2);
|
1999-10-28 23:37:14 +00:00
|
|
|
|
|
|
|
/* Copy the result to xformResult */
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
|
|
|
{
|
|
|
|
/* pointer was already probed! */
|
|
|
|
*UnsafeXFormResult = xformTemp;
|
|
|
|
}
|
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
|
|
|
Status = _SEH_GetExceptionCode();
|
|
|
|
}
|
|
|
|
_SEH_END;
|
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
1999-10-28 23:37:14 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
return Ret;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2003-12-21 18:38:37 +00:00
|
|
|
VOID FASTCALL
|
2002-07-04 19:56:38 +00:00
|
|
|
CoordDPtoLP(PDC Dc, LPPOINT Point)
|
2002-07-13 21:37:27 +00:00
|
|
|
{
|
2002-07-04 19:56:38 +00:00
|
|
|
FLOAT x, y;
|
|
|
|
x = (FLOAT)Point->x;
|
|
|
|
y = (FLOAT)Point->y;
|
|
|
|
Point->x = x * Dc->w.xformVport2World.eM11 +
|
|
|
|
y * Dc->w.xformVport2World.eM21 + Dc->w.xformVport2World.eDx;
|
|
|
|
Point->y = x * Dc->w.xformVport2World.eM12 +
|
2002-07-13 21:37:27 +00:00
|
|
|
y * Dc->w.xformVport2World.eM22 + Dc->w.xformVport2World.eDy;
|
2002-07-04 19:56:38 +00:00
|
|
|
}
|
|
|
|
|
2003-12-21 18:38:37 +00:00
|
|
|
VOID
|
|
|
|
FASTCALL
|
|
|
|
IntDPtoLP ( PDC dc, LPPOINT Points, INT Count )
|
|
|
|
{
|
|
|
|
INT i;
|
|
|
|
|
|
|
|
ASSERT ( Points );
|
|
|
|
|
|
|
|
for ( i = 0; i < Count; i++ )
|
|
|
|
CoordDPtoLP ( dc, &Points[i] );
|
|
|
|
}
|
|
|
|
|
2003-08-17 17:32:58 +00:00
|
|
|
int
|
|
|
|
FASTCALL
|
|
|
|
IntGetGraphicsMode ( PDC dc )
|
|
|
|
{
|
2007-11-18 13:51:34 +00:00
|
|
|
PDC_ATTR Dc_Attr;
|
2003-08-17 17:32:58 +00:00
|
|
|
ASSERT ( dc );
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr = dc->pDc_Attr;
|
|
|
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
|
|
|
return Dc_Attr->iGraphicsMode;
|
2003-08-17 17:32:58 +00:00
|
|
|
}
|
|
|
|
|
2006-09-13 16:50:19 +00:00
|
|
|
BOOL
|
|
|
|
FASTCALL
|
|
|
|
IntGdiModifyWorldTransform(PDC pDc,
|
|
|
|
CONST LPXFORM lpXForm,
|
|
|
|
DWORD Mode)
|
|
|
|
{
|
|
|
|
ASSERT(pDc && lpXForm);
|
|
|
|
|
|
|
|
switch(Mode)
|
|
|
|
{
|
|
|
|
case MWT_IDENTITY:
|
|
|
|
pDc->w.xformWorld2Wnd.eM11 = 1.0f;
|
|
|
|
pDc->w.xformWorld2Wnd.eM12 = 0.0f;
|
|
|
|
pDc->w.xformWorld2Wnd.eM21 = 0.0f;
|
|
|
|
pDc->w.xformWorld2Wnd.eM22 = 1.0f;
|
|
|
|
pDc->w.xformWorld2Wnd.eDx = 0.0f;
|
|
|
|
pDc->w.xformWorld2Wnd.eDy = 0.0f;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MWT_LEFTMULTIPLY:
|
|
|
|
IntGdiCombineTransform(&pDc->w.xformWorld2Wnd, lpXForm, &pDc->w.xformWorld2Wnd );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MWT_RIGHTMULTIPLY:
|
|
|
|
IntGdiCombineTransform(&pDc->w.xformWorld2Wnd, &pDc->w.xformWorld2Wnd, lpXForm);
|
|
|
|
break;
|
|
|
|
|
2007-08-11 18:15:02 +00:00
|
|
|
case MWT_MAX+1: // Must be MWT_SET????
|
|
|
|
pDc->w.xformWorld2Wnd = *lpXForm; // Do it like Wine.
|
|
|
|
break;
|
|
|
|
|
2006-09-13 16:50:19 +00:00
|
|
|
default:
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
DC_UpdateXforms(pDc);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
int
|
|
|
|
STDCALL
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiGetGraphicsMode ( HDC hDC )
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
2004-01-04 21:26:59 +00:00
|
|
|
PDC dc;
|
2007-11-18 13:51:34 +00:00
|
|
|
PDC_ATTR Dc_Attr;
|
2004-01-04 21:26:59 +00:00
|
|
|
int GraphicsMode; // default to failure
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
dc = DC_LockDc ( hDC );
|
|
|
|
if (!dc)
|
2001-03-31 15:35:08 +00:00
|
|
|
{
|
2004-01-04 21:26:59 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
|
|
|
return 0;
|
2001-03-31 15:35:08 +00:00
|
|
|
}
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr = dc->pDc_Attr;
|
|
|
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
|
|
|
GraphicsMode = Dc_Attr->iGraphicsMode;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2003-08-17 17:32:58 +00:00
|
|
|
return GraphicsMode;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
2007-08-21 05:01:00 +00:00
|
|
|
NtGdiGetTransform(HDC hDC,
|
|
|
|
DWORD iXform,
|
|
|
|
LPXFORM XForm)
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
2007-04-02 15:08:54 +00:00
|
|
|
PDC dc;
|
2005-07-26 12:22:55 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
dc = DC_LockDc ( hDC );
|
1999-10-28 23:37:14 +00:00
|
|
|
if (!dc)
|
2004-01-04 21:26:59 +00:00
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
2003-08-20 22:07:36 +00:00
|
|
|
return FALSE;
|
2004-01-04 21:26:59 +00:00
|
|
|
}
|
|
|
|
if (!XForm)
|
|
|
|
{
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
|
|
|
{
|
|
|
|
ProbeForWrite(XForm,
|
|
|
|
sizeof(XFORM),
|
|
|
|
1);
|
2007-08-21 05:01:00 +00:00
|
|
|
switch(iXform)
|
|
|
|
{
|
|
|
|
case GdiWorldSpaceToPageSpace:
|
|
|
|
*XForm = dc->w.xformWorld2Wnd;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
|
|
|
Status = _SEH_GetExceptionCode();
|
|
|
|
}
|
|
|
|
_SEH_END;
|
2003-08-20 22:07:36 +00:00
|
|
|
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
return NT_SUCCESS(Status);
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2003-08-17 17:32:58 +00:00
|
|
|
VOID
|
|
|
|
FASTCALL
|
|
|
|
CoordLPtoDP ( PDC Dc, LPPOINT Point )
|
2002-07-04 19:56:38 +00:00
|
|
|
{
|
|
|
|
FLOAT x, y;
|
2003-08-20 22:07:36 +00:00
|
|
|
|
|
|
|
ASSERT ( Dc );
|
|
|
|
ASSERT ( Point );
|
|
|
|
|
2002-07-04 19:56:38 +00:00
|
|
|
x = (FLOAT)Point->x;
|
|
|
|
y = (FLOAT)Point->y;
|
|
|
|
Point->x = x * Dc->w.xformWorld2Vport.eM11 +
|
|
|
|
y * Dc->w.xformWorld2Vport.eM21 + Dc->w.xformWorld2Vport.eDx;
|
|
|
|
Point->y = x * Dc->w.xformWorld2Vport.eM12 +
|
|
|
|
y * Dc->w.xformWorld2Vport.eM22 + Dc->w.xformWorld2Vport.eDy;
|
|
|
|
}
|
|
|
|
|
2003-08-17 17:32:58 +00:00
|
|
|
VOID
|
|
|
|
FASTCALL
|
|
|
|
IntLPtoDP ( PDC dc, LPPOINT Points, INT Count )
|
|
|
|
{
|
|
|
|
INT i;
|
|
|
|
|
2003-08-20 22:07:36 +00:00
|
|
|
ASSERT ( Points );
|
|
|
|
|
2003-08-17 17:32:58 +00:00
|
|
|
for ( i = 0; i < Count; i++ )
|
|
|
|
CoordLPtoDP ( dc, &Points[i] );
|
|
|
|
}
|
|
|
|
|
2003-03-14 22:48:32 +00:00
|
|
|
/*!
|
|
|
|
* Converts points from logical coordinates into device coordinates. Conversion depends on the mapping mode,
|
|
|
|
* world transfrom, viewport origin settings for the given device context.
|
|
|
|
* \param hDC device context.
|
|
|
|
* \param Points an array of POINT structures (in/out).
|
|
|
|
* \param Count number of elements in the array of POINT structures.
|
|
|
|
* \return TRUE if success.
|
|
|
|
*/
|
2007-08-10 07:39:46 +00:00
|
|
|
BOOL
|
|
|
|
APIENTRY
|
|
|
|
NtGdiTransformPoints( HDC hDC,
|
|
|
|
PPOINT UnsafePtsIn,
|
|
|
|
PPOINT UnsafePtOut,
|
|
|
|
INT Count,
|
|
|
|
INT iMode )
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
2007-04-02 15:08:54 +00:00
|
|
|
PDC dc;
|
2005-07-26 12:22:55 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
2007-04-02 15:08:54 +00:00
|
|
|
LPPOINT Points;
|
|
|
|
ULONG Size;
|
2003-08-17 17:32:58 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
dc = DC_LockDc(hDC);
|
|
|
|
if (!dc)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2007-08-10 07:39:46 +00:00
|
|
|
if (!UnsafePtsIn || !UnsafePtOut || Count <= 0)
|
2004-01-04 21:26:59 +00:00
|
|
|
{
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
Size = Count * sizeof(POINT);
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-02-19 21:12:11 +00:00
|
|
|
Points = (LPPOINT)ExAllocatePoolWithTag(PagedPool, Size, TAG_COORD);
|
2004-01-04 21:26:59 +00:00
|
|
|
if(!Points)
|
|
|
|
{
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
|
|
|
{
|
2007-08-10 07:39:46 +00:00
|
|
|
ProbeForWrite(UnsafePtOut,
|
|
|
|
Size,
|
|
|
|
1);
|
|
|
|
ProbeForRead(UnsafePtsIn,
|
2005-07-26 12:22:55 +00:00
|
|
|
Size,
|
|
|
|
1);
|
|
|
|
RtlCopyMemory(Points,
|
2007-08-10 07:39:46 +00:00
|
|
|
UnsafePtsIn,
|
2005-07-26 12:22:55 +00:00
|
|
|
Size);
|
|
|
|
}
|
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
|
|
|
Status = _SEH_GetExceptionCode();
|
|
|
|
}
|
|
|
|
_SEH_END;
|
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
ExFreePool(Points);
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2007-08-10 07:39:46 +00:00
|
|
|
switch (iMode)
|
|
|
|
{
|
|
|
|
case GdiDpToLp:
|
|
|
|
IntDPtoLP(dc, Points, Count);
|
|
|
|
break;
|
|
|
|
case GdiLpToDp:
|
|
|
|
IntLPtoDP(dc, Points, Count);
|
|
|
|
break;
|
|
|
|
case 2: // Not supported yet. Need testing.
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
DC_UnlockDc(dc);
|
|
|
|
ExFreePool(Points);
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
|
|
|
{
|
|
|
|
/* pointer was already probed! */
|
2007-08-10 07:39:46 +00:00
|
|
|
RtlCopyMemory(UnsafePtOut,
|
2005-07-26 12:22:55 +00:00
|
|
|
Points,
|
|
|
|
Size);
|
|
|
|
}
|
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
|
|
|
Status = _SEH_GetExceptionCode();
|
|
|
|
}
|
|
|
|
_SEH_END;
|
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
ExFreePool(Points);
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2007-08-21 05:01:00 +00:00
|
|
|
//
|
|
|
|
// If we are getting called that means User XForms is a mess!
|
|
|
|
//
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
ExFreePool(Points);
|
|
|
|
return TRUE;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
2006-09-13 16:50:19 +00:00
|
|
|
NtGdiModifyWorldTransform(HDC hDC,
|
2007-11-26 11:24:48 +00:00
|
|
|
LPXFORM UnsafeXForm,
|
2006-09-13 16:50:19 +00:00
|
|
|
DWORD Mode)
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
2007-04-02 15:08:54 +00:00
|
|
|
PDC dc;
|
2006-09-13 16:50:19 +00:00
|
|
|
XFORM SafeXForm;
|
|
|
|
BOOL Ret = FALSE;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2006-09-13 16:50:19 +00:00
|
|
|
if (!UnsafeXForm)
|
2004-01-04 21:26:59 +00:00
|
|
|
{
|
2006-09-13 16:50:19 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
2004-01-04 21:26:59 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2006-09-13 16:50:19 +00:00
|
|
|
dc = DC_LockDc(hDC);
|
|
|
|
if (!dc)
|
2004-01-04 21:26:59 +00:00
|
|
|
{
|
2006-09-13 16:50:19 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
2004-01-04 21:26:59 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
|
|
|
{
|
2006-09-13 16:50:19 +00:00
|
|
|
ProbeForRead(UnsafeXForm, sizeof(XFORM), 1);
|
|
|
|
RtlCopyMemory(&SafeXForm, UnsafeXForm, sizeof(XFORM));
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
2006-09-13 16:50:19 +00:00
|
|
|
SetLastNtError(_SEH_GetExceptionCode());
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
|
|
|
_SEH_END;
|
|
|
|
|
2007-08-21 23:27:44 +00:00
|
|
|
// Safe to handle kernel mode data.
|
|
|
|
Ret = IntGdiModifyWorldTransform(dc, &SafeXForm, Mode);
|
2006-09-13 16:50:19 +00:00
|
|
|
DC_UnlockDc(dc);
|
|
|
|
return Ret;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiOffsetViewportOrgEx(HDC hDC,
|
2003-05-27 07:23:05 +00:00
|
|
|
int XOffset,
|
|
|
|
int YOffset,
|
|
|
|
LPPOINT UnsafePoint)
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
2007-04-02 15:08:54 +00:00
|
|
|
PDC dc;
|
2007-11-18 13:51:34 +00:00
|
|
|
PDC_ATTR Dc_Attr;
|
2005-07-26 12:22:55 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
2003-05-27 07:23:05 +00:00
|
|
|
|
2003-08-20 22:07:36 +00:00
|
|
|
dc = DC_LockDc ( hDC );
|
2004-01-04 21:26:59 +00:00
|
|
|
if(!dc)
|
2003-08-20 22:07:36 +00:00
|
|
|
{
|
2004-01-04 21:26:59 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr = dc->pDc_Attr;
|
|
|
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
if (UnsafePoint)
|
|
|
|
{
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
|
|
|
{
|
|
|
|
ProbeForWrite(UnsafePoint,
|
|
|
|
sizeof(POINT),
|
|
|
|
1);
|
2007-11-18 13:51:34 +00:00
|
|
|
UnsafePoint->x = Dc_Attr->ptlViewportOrg.x;
|
|
|
|
UnsafePoint->y = Dc_Attr->ptlViewportOrg.y;
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
|
|
|
Status = _SEH_GetExceptionCode();
|
|
|
|
}
|
|
|
|
_SEH_END;
|
|
|
|
|
2003-08-20 22:07:36 +00:00
|
|
|
if ( !NT_SUCCESS(Status) )
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
return FALSE;
|
2003-08-20 22:07:36 +00:00
|
|
|
}
|
2003-05-27 07:23:05 +00:00
|
|
|
}
|
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->ptlViewportOrg.x += XOffset;
|
|
|
|
Dc_Attr->ptlViewportOrg.y += YOffset;
|
2004-01-04 21:26:59 +00:00
|
|
|
DC_UpdateXforms(dc);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2003-05-27 07:23:05 +00:00
|
|
|
return TRUE;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiOffsetWindowOrgEx(HDC hDC,
|
2003-07-22 20:02:08 +00:00
|
|
|
int XOffset,
|
|
|
|
int YOffset,
|
|
|
|
LPPOINT Point)
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
2007-04-02 15:08:54 +00:00
|
|
|
PDC dc;
|
2007-11-18 13:51:34 +00:00
|
|
|
PDC_ATTR Dc_Attr;
|
|
|
|
|
2003-08-20 07:45:02 +00:00
|
|
|
dc = DC_LockDc(hDC);
|
2003-07-22 20:02:08 +00:00
|
|
|
if (!dc)
|
|
|
|
{
|
2004-01-04 21:26:59 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
2003-07-22 20:02:08 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr = dc->pDc_Attr;
|
|
|
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
2003-07-22 20:02:08 +00:00
|
|
|
|
|
|
|
if (Point)
|
|
|
|
{
|
2005-07-26 12:22:55 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
|
|
|
{
|
|
|
|
ProbeForWrite(Point,
|
|
|
|
sizeof(POINT),
|
|
|
|
1);
|
2007-11-18 13:51:34 +00:00
|
|
|
Point->x = Dc_Attr->ptlWindowOrg.x;
|
|
|
|
Point->y = Dc_Attr->ptlWindowOrg.y;
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
|
|
|
Status = _SEH_GetExceptionCode();
|
|
|
|
}
|
|
|
|
_SEH_END;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2003-07-22 20:02:08 +00:00
|
|
|
}
|
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->ptlWindowOrg.x += XOffset;
|
|
|
|
Dc_Attr->ptlWindowOrg.y += YOffset;
|
2003-07-22 20:02:08 +00:00
|
|
|
|
2004-06-18 15:18:58 +00:00
|
|
|
DC_UpdateXforms(dc);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2003-07-22 20:02:08 +00:00
|
|
|
|
|
|
|
return TRUE;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiScaleViewportExtEx(HDC hDC,
|
1999-07-22 16:21:53 +00:00
|
|
|
int Xnum,
|
|
|
|
int Xdenom,
|
|
|
|
int Ynum,
|
|
|
|
int Ydenom,
|
|
|
|
LPSIZE Size)
|
|
|
|
{
|
2004-07-14 20:48:58 +00:00
|
|
|
UNIMPLEMENTED;
|
|
|
|
return FALSE;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiScaleWindowExtEx(HDC hDC,
|
1999-07-22 16:21:53 +00:00
|
|
|
int Xnum,
|
|
|
|
int Xdenom,
|
|
|
|
int Ynum,
|
|
|
|
int Ydenom,
|
|
|
|
LPSIZE Size)
|
|
|
|
{
|
2004-07-14 20:48:58 +00:00
|
|
|
UNIMPLEMENTED;
|
|
|
|
return FALSE;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
int
|
|
|
|
STDCALL
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiSetGraphicsMode(HDC hDC,
|
2003-07-22 20:02:08 +00:00
|
|
|
int Mode)
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
1999-10-28 23:37:14 +00:00
|
|
|
INT ret;
|
2003-07-22 20:02:08 +00:00
|
|
|
PDC dc;
|
2007-11-18 13:51:34 +00:00
|
|
|
PDC_ATTR Dc_Attr;
|
2002-07-13 21:37:27 +00:00
|
|
|
|
2003-08-20 07:45:02 +00:00
|
|
|
dc = DC_LockDc (hDC);
|
1999-10-28 23:37:14 +00:00
|
|
|
if (!dc)
|
2001-03-31 15:35:08 +00:00
|
|
|
{
|
2004-01-04 21:26:59 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
2001-03-31 15:35:08 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr = dc->pDc_Attr;
|
|
|
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
1999-10-28 23:37:14 +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.
|
|
|
|
*/
|
2002-07-13 21:37:27 +00:00
|
|
|
|
|
|
|
if ((Mode != GM_COMPATIBLE) && (Mode != GM_ADVANCED))
|
2003-07-22 20:02:08 +00:00
|
|
|
{
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
2003-07-22 20:02:08 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
ret = Dc_Attr->iGraphicsMode;
|
|
|
|
Dc_Attr->iGraphicsMode = Mode;
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
1999-10-28 23:37:14 +00:00
|
|
|
return ret;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
int
|
|
|
|
STDCALL
|
2007-08-21 09:28:51 +00:00
|
|
|
IntGdiSetMapMode(PDC dc,
|
2003-08-20 22:07:36 +00:00
|
|
|
int MapMode)
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
2003-07-22 20:02:08 +00:00
|
|
|
int PrevMapMode;
|
2007-11-18 13:51:34 +00:00
|
|
|
PDC_ATTR Dc_Attr = dc->pDc_Attr;
|
|
|
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
2003-07-22 20:02:08 +00:00
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
PrevMapMode = Dc_Attr->iMapMode;
|
2006-06-21 08:33:27 +00:00
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
if (MapMode != Dc_Attr->iMapMode || (MapMode != MM_ISOTROPIC && MapMode != MM_ANISOTROPIC))
|
2006-06-21 08:33:27 +00:00
|
|
|
{
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->iMapMode = MapMode;
|
2006-06-21 08:33:27 +00:00
|
|
|
|
|
|
|
switch (MapMode)
|
|
|
|
{
|
|
|
|
case MM_TEXT:
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->szlWindowExt.cx = 1;
|
|
|
|
Dc_Attr->szlWindowExt.cy = 1;
|
|
|
|
Dc_Attr->szlViewportExt.cx = 1;
|
|
|
|
Dc_Attr->szlViewportExt.cy = 1;
|
2006-06-21 08:33:27 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case MM_LOMETRIC:
|
|
|
|
case MM_ISOTROPIC:
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->szlWindowExt.cx = ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzSize * 10;
|
|
|
|
Dc_Attr->szlWindowExt.cy = ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertSize * 10;
|
|
|
|
Dc_Attr->szlViewportExt.cx = ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzRes;
|
|
|
|
Dc_Attr->szlViewportExt.cy = -((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertRes;
|
2006-06-21 08:33:27 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case MM_HIMETRIC:
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->szlWindowExt.cx = ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzSize * 100;
|
|
|
|
Dc_Attr->szlWindowExt.cy = ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertSize * 100;
|
|
|
|
Dc_Attr->szlViewportExt.cx = ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzRes;
|
|
|
|
Dc_Attr->szlViewportExt.cy = -((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertRes;
|
2006-06-21 08:33:27 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case MM_LOENGLISH:
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->szlWindowExt.cx = EngMulDiv(1000, ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzSize, 254);
|
|
|
|
Dc_Attr->szlWindowExt.cy = EngMulDiv(1000, ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertSize, 254);
|
|
|
|
Dc_Attr->szlViewportExt.cx = ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzRes;
|
|
|
|
Dc_Attr->szlViewportExt.cy = -((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertRes;
|
2006-06-21 08:33:27 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case MM_HIENGLISH:
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->szlWindowExt.cx = EngMulDiv(10000, ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzSize, 254);
|
|
|
|
Dc_Attr->szlWindowExt.cy = EngMulDiv(10000, ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertSize, 254);
|
|
|
|
Dc_Attr->szlViewportExt.cx = ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzRes;
|
|
|
|
Dc_Attr->szlViewportExt.cy = -((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertRes;
|
2006-06-21 08:33:27 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case MM_TWIPS:
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->szlWindowExt.cx = EngMulDiv(14400, ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzSize, 254);
|
|
|
|
Dc_Attr->szlWindowExt.cy = EngMulDiv(14400, ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertSize, 254);
|
|
|
|
Dc_Attr->szlViewportExt.cx = ((PGDIDEVICE)dc->pPDev)->GDIInfo.ulHorzRes;
|
|
|
|
Dc_Attr->szlViewportExt.cy = -((PGDIDEVICE)dc->pPDev)->GDIInfo.ulVertRes;
|
2006-06-21 08:33:27 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case MM_ANISOTROPIC:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
DC_UpdateXforms(dc);
|
|
|
|
}
|
2003-07-22 20:02:08 +00:00
|
|
|
|
|
|
|
return PrevMapMode;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiSetViewportExtEx(HDC hDC,
|
2003-08-20 22:07:36 +00:00
|
|
|
int XExtent,
|
|
|
|
int YExtent,
|
|
|
|
LPSIZE Size)
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
2007-04-02 15:08:54 +00:00
|
|
|
PDC dc;
|
2007-11-18 13:51:34 +00:00
|
|
|
PDC_ATTR Dc_Attr;
|
2003-07-22 20:02:08 +00:00
|
|
|
|
2003-08-20 07:45:02 +00:00
|
|
|
dc = DC_LockDc(hDC);
|
2003-08-20 22:07:36 +00:00
|
|
|
if ( !dc )
|
2004-01-04 21:26:59 +00:00
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
2003-08-20 22:07:36 +00:00
|
|
|
return FALSE;
|
2004-01-04 21:26:59 +00:00
|
|
|
}
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr = dc->pDc_Attr;
|
|
|
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
2003-07-22 20:02:08 +00:00
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
switch (Dc_Attr->iMapMode)
|
2003-07-22 20:02:08 +00:00
|
|
|
{
|
|
|
|
case MM_HIENGLISH:
|
|
|
|
case MM_HIMETRIC:
|
|
|
|
case MM_LOENGLISH:
|
|
|
|
case MM_LOMETRIC:
|
|
|
|
case MM_TEXT:
|
|
|
|
case MM_TWIPS:
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2003-07-22 20:02:08 +00:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
case MM_ISOTROPIC:
|
|
|
|
// Here we should (probably) check that SetWindowExtEx *really* has
|
|
|
|
// been called
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Size)
|
|
|
|
{
|
2005-07-26 12:22:55 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
|
|
|
{
|
|
|
|
ProbeForWrite(Size,
|
|
|
|
sizeof(SIZE),
|
|
|
|
1);
|
2007-11-18 13:51:34 +00:00
|
|
|
Size->cx = Dc_Attr->szlViewportExt.cx;
|
|
|
|
Size->cy = Dc_Attr->szlViewportExt.cy;
|
2006-09-25 21:28:09 +00:00
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->szlViewportExt.cx = XExtent;
|
|
|
|
Dc_Attr->szlViewportExt.cy = YExtent;
|
2006-09-25 21:28:09 +00:00
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
if (Dc_Attr->iMapMode == MM_ISOTROPIC)
|
2006-09-25 21:28:09 +00:00
|
|
|
IntFixIsotropicMapping(dc);
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
|
|
|
Status = _SEH_GetExceptionCode();
|
|
|
|
}
|
|
|
|
_SEH_END;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2003-07-22 20:02:08 +00:00
|
|
|
}
|
|
|
|
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2004-06-18 15:18:58 +00:00
|
|
|
DC_UpdateXforms(dc);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2003-07-22 20:02:08 +00:00
|
|
|
|
|
|
|
return TRUE;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiSetViewportOrgEx(HDC hDC,
|
2003-07-22 20:02:08 +00:00
|
|
|
int X,
|
|
|
|
int Y,
|
|
|
|
LPPOINT Point)
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
2007-04-02 15:08:54 +00:00
|
|
|
PDC dc;
|
2007-11-18 13:51:34 +00:00
|
|
|
PDC_ATTR Dc_Attr;
|
2003-07-22 20:02:08 +00:00
|
|
|
|
2003-08-20 07:45:02 +00:00
|
|
|
dc = DC_LockDc(hDC);
|
2003-07-22 20:02:08 +00:00
|
|
|
if (!dc)
|
|
|
|
{
|
2004-01-04 21:26:59 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
2003-07-22 20:02:08 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr = dc->pDc_Attr;
|
|
|
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
2003-07-22 20:02:08 +00:00
|
|
|
|
|
|
|
if (Point)
|
|
|
|
{
|
2005-07-26 12:22:55 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
|
|
|
{
|
|
|
|
ProbeForWrite(Point,
|
|
|
|
sizeof(POINT),
|
|
|
|
1);
|
2007-11-18 13:51:34 +00:00
|
|
|
Point->x = Dc_Attr->ptlViewportOrg.x;
|
|
|
|
Point->y = Dc_Attr->ptlViewportOrg.y;
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
|
|
|
Status = _SEH_GetExceptionCode();
|
|
|
|
}
|
|
|
|
_SEH_END;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2003-07-22 20:02:08 +00:00
|
|
|
}
|
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->ptlViewportOrg.x = X;
|
|
|
|
Dc_Attr->ptlViewportOrg.y = Y;
|
2003-07-22 20:02:08 +00:00
|
|
|
|
2004-06-14 20:58:51 +00:00
|
|
|
DC_UpdateXforms(dc);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2003-07-22 20:02:08 +00:00
|
|
|
|
|
|
|
return TRUE;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiSetWindowExtEx(HDC hDC,
|
2003-07-22 20:02:08 +00:00
|
|
|
int XExtent,
|
|
|
|
int YExtent,
|
|
|
|
LPSIZE Size)
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
2007-04-02 15:08:54 +00:00
|
|
|
PDC dc;
|
2007-11-18 13:51:34 +00:00
|
|
|
PDC_ATTR Dc_Attr;
|
2003-07-22 20:02:08 +00:00
|
|
|
|
2003-08-20 07:45:02 +00:00
|
|
|
dc = DC_LockDc(hDC);
|
2003-07-22 20:02:08 +00:00
|
|
|
if (!dc)
|
|
|
|
{
|
2004-01-04 21:26:59 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
2003-07-22 20:02:08 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr = dc->pDc_Attr;
|
|
|
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
2003-07-22 20:02:08 +00:00
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
switch (Dc_Attr->iMapMode)
|
2003-07-22 20:02:08 +00:00
|
|
|
{
|
|
|
|
case MM_HIENGLISH:
|
|
|
|
case MM_HIMETRIC:
|
|
|
|
case MM_LOENGLISH:
|
|
|
|
case MM_LOMETRIC:
|
|
|
|
case MM_TEXT:
|
|
|
|
case MM_TWIPS:
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2003-07-22 20:02:08 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-07-22 20:02:08 +00:00
|
|
|
if (Size)
|
|
|
|
{
|
2005-07-26 12:22:55 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
|
|
|
{
|
|
|
|
ProbeForWrite(Size,
|
|
|
|
sizeof(SIZE),
|
|
|
|
1);
|
2007-11-18 13:51:34 +00:00
|
|
|
Size->cx = Dc_Attr->szlWindowExt.cx;
|
|
|
|
Size->cy = Dc_Attr->szlWindowExt.cy;
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
|
|
|
Status = _SEH_GetExceptionCode();
|
|
|
|
}
|
|
|
|
_SEH_END;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2003-07-22 20:02:08 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->szlWindowExt.cx = XExtent;
|
|
|
|
Dc_Attr->szlWindowExt.cy = YExtent;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-06-18 15:18:58 +00:00
|
|
|
DC_UpdateXforms(dc);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2003-07-22 20:02:08 +00:00
|
|
|
|
|
|
|
return TRUE;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
2000-02-20 22:52:50 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
2003-08-19 11:48:50 +00:00
|
|
|
NtGdiSetWindowOrgEx(HDC hDC,
|
2003-07-22 20:02:08 +00:00
|
|
|
int X,
|
|
|
|
int Y,
|
|
|
|
LPPOINT Point)
|
1999-07-22 16:21:53 +00:00
|
|
|
{
|
2007-04-02 15:08:54 +00:00
|
|
|
PDC dc;
|
2007-11-18 13:51:34 +00:00
|
|
|
PDC_ATTR Dc_Attr;
|
2003-07-22 20:02:08 +00:00
|
|
|
|
2003-08-20 07:45:02 +00:00
|
|
|
dc = DC_LockDc(hDC);
|
2003-07-22 20:02:08 +00:00
|
|
|
if (!dc)
|
|
|
|
{
|
2004-01-04 21:26:59 +00:00
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
2003-07-22 20:02:08 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr = dc->pDc_Attr;
|
|
|
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2003-07-22 20:02:08 +00:00
|
|
|
if (Point)
|
|
|
|
{
|
2005-07-26 12:22:55 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2005-07-26 12:22:55 +00:00
|
|
|
_SEH_TRY
|
|
|
|
{
|
|
|
|
ProbeForWrite(Point,
|
|
|
|
sizeof(POINT),
|
|
|
|
1);
|
2007-11-18 13:51:34 +00:00
|
|
|
Point->x = Dc_Attr->ptlWindowOrg.x;
|
|
|
|
Point->y = Dc_Attr->ptlWindowOrg.y;
|
2005-07-26 12:22:55 +00:00
|
|
|
}
|
|
|
|
_SEH_HANDLE
|
|
|
|
{
|
|
|
|
Status = _SEH_GetExceptionCode();
|
|
|
|
}
|
|
|
|
_SEH_END;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-01-04 21:26:59 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2004-01-04 21:26:59 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2003-07-22 20:02:08 +00:00
|
|
|
}
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2007-11-18 13:51:34 +00:00
|
|
|
Dc_Attr->ptlWindowOrg.x = X;
|
|
|
|
Dc_Attr->ptlWindowOrg.y = Y;
|
2005-05-08 02:11:54 +00:00
|
|
|
|
2004-06-18 15:18:58 +00:00
|
|
|
DC_UpdateXforms(dc);
|
2005-06-07 16:34:07 +00:00
|
|
|
DC_UnlockDc(dc);
|
2003-07-22 20:02:08 +00:00
|
|
|
|
|
|
|
return TRUE;
|
1999-07-22 16:21:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-05-18 17:16:18 +00:00
|
|
|
/* EOF */
|