X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=subsys%2Fwin32k%2Fobjects%2Fcoord.c;h=5b9e370c5d12edbc93fd17af26ec59dbe1247f39;hb=refs%2Ftags%2FHEAD-2003050101;hp=cf3b3448f0a31f2c47aa72c8f538ecfb6a6676d2;hpb=e3ed2d773259cc445c7ff8181ebd934931365328;p=reactos.git diff --git a/subsys/win32k/objects/coord.c b/subsys/win32k/objects/coord.c index cf3b344..5b9e370 100644 --- a/subsys/win32k/objects/coord.c +++ b/subsys/win32k/objects/coord.c @@ -11,36 +11,41 @@ #include #include +#include #include #include - -//#define NDEBUG +#define NDEBUG #include /* FUNCTIONS *****************************************************************/ -BOOL STDCALL W32kCombineTransform(LPXFORM XFormResult, - CONST LPXFORM xform1, - CONST LPXFORM xform2) +BOOL STDCALL W32kCombineTransform(LPXFORM UnsafeXFormResult, + CONST LPXFORM Unsafexform1, + CONST LPXFORM Unsafexform2) { XFORM xformTemp; + XFORM xform1, xform2; /* Check for illegal parameters */ - if (!XFormResult || !xform1 || !xform2) + if (!UnsafeXFormResult || !Unsafexform1 || !Unsafexform2) { return FALSE; } + + MmCopyFromCaller( &xform1, Unsafexform1, sizeof(XFORM) ); + MmCopyFromCaller( &xform2, Unsafexform2, sizeof(XFORM) ); + /* Create the result in a temporary XFORM, since xformResult may be * equal to xform1 or xform2 */ - xformTemp.eM11 = xform1->eM11 * xform2->eM11 + xform1->eM12 * xform2->eM21; - xformTemp.eM12 = xform1->eM11 * xform2->eM12 + xform1->eM12 * xform2->eM22; - xformTemp.eM21 = xform1->eM21 * xform2->eM11 + xform1->eM22 * xform2->eM21; - xformTemp.eM22 = xform1->eM21 * xform2->eM12 + xform1->eM22 * xform2->eM22; - xformTemp.eDx = xform1->eDx * xform2->eM11 + xform1->eDy * xform2->eM21 + xform2->eDx; - xformTemp.eDy = xform1->eDx * xform2->eM12 + xform1->eDy * xform2->eM22 + xform2->eDy; + xformTemp.eM11 = xform1.eM11 * xform2.eM11 + xform1.eM12 * xform2.eM21; + xformTemp.eM12 = xform1.eM11 * xform2.eM12 + xform1.eM12 * xform2.eM22; + xformTemp.eM21 = xform1.eM21 * xform2.eM11 + xform1.eM22 * xform2.eM21; + xformTemp.eM22 = xform1.eM21 * xform2.eM12 + xform1.eM22 * xform2.eM22; + xformTemp.eDx = xform1.eDx * xform2.eM11 + xform1.eDy * xform2.eM21 + xform2.eDx; + xformTemp.eDy = xform1.eDx * xform2.eM12 + xform1.eDy * xform2.eM22 + xform2.eDy; /* Copy the result to xformResult */ - *XFormResult = xformTemp; + MmCopyToCaller( UnsafeXFormResult, &xformTemp, sizeof(XFORM) ); return TRUE; } @@ -57,13 +62,25 @@ FLOAT x, y; y * Dc->w.xformVport2World.eM22 + Dc->w.xformVport2World.eDy; } +/*! + * Converts points from device coordinates into logical 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. +*/ BOOL STDCALL W32kDPtoLP(HDC hDC, - LPPOINT Points, + LPPOINT UnsafePoints, int Count) { PDC Dc; ULONG i; + LPPOINT Points = (LPPOINT) ExAllocatePool( PagedPool, Count*sizeof(POINT)); + + ASSERT(Points); + MmCopyFromCaller( Points, UnsafePoints, Count*sizeof(POINT) ); Dc = DC_HandleToPtr (hDC); if (Dc == NULL || !Dc->w.vport2WorldValid) @@ -76,6 +93,8 @@ W32kDPtoLP(HDC hDC, CoordDPtoLP(Dc, &Points[i]); } DC_ReleasePtr( hDC ); + + MmCopyToCaller( UnsafePoints, Points, Count*sizeof(POINT) ); return(TRUE); } @@ -130,11 +149,23 @@ CoordLPtoDP(PDC Dc, LPPOINT Point) y * Dc->w.xformWorld2Vport.eM22 + Dc->w.xformWorld2Vport.eDy; } +/*! + * 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. +*/ BOOL STDCALL -W32kLPtoDP(HDC hDC, LPPOINT Points, INT Count) +W32kLPtoDP(HDC hDC, LPPOINT UnsafePoints, INT Count) { PDC Dc; ULONG i; + LPPOINT Points = (LPPOINT) ExAllocatePool( PagedPool, Count*sizeof(POINT)); + + ASSERT(Points); + MmCopyFromCaller( Points, UnsafePoints, Count*sizeof(POINT) ); Dc = DC_HandleToPtr (hDC); if (Dc == NULL) @@ -147,16 +178,22 @@ W32kLPtoDP(HDC hDC, LPPOINT Points, INT Count) CoordLPtoDP(Dc, &Points[i]); } DC_ReleasePtr( hDC ); + MmCopyToCaller( UnsafePoints, Points, Count*sizeof(POINT) ); return(TRUE); } BOOL STDCALL W32kModifyWorldTransform(HDC hDC, - CONST LPXFORM XForm, + CONST LPXFORM UnsafeXForm, DWORD Mode) { PDC dc; + LPXFORM XForm = (LPXFORM) ExAllocatePool( PagedPool, sizeof( XFORM ) ); + + ASSERT( XForm ); + + MmCopyFromCaller( XForm, UnsafeXForm, sizeof( XFORM ) ); dc = DC_HandleToPtr (hDC); if (!dc)