Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

423 lines
8.5 KiB

/******************************Module*Header*******************************\
* Module Name: xformddi.cxx
*
* Transform DDI callback routines.
*
* Created: 13-May-1991 19:08:43
* Author: Wendy Wu [wendywu]
*
* Copyright (c) 1990-1999 Microsoft Corporation
\**************************************************************************/
#include "precomp.hxx"
/******************************Public*Routine******************************\
* BOOL XFORMOBJ_bApplyXform(
* XFORMOBJ *pxo,
* ULONG iMode,
* ULONG cPoints,
* PVOID pvIn,
* PVOID pvOut)
*
* Applies the transform or its inverse to the given array of points.
*
* History:
* 13-May-1991 -by- Wendy Wu [wendywu]
* Wrote it.
\**************************************************************************/
BOOL XFORMOBJ_bApplyXform(
XFORMOBJ *pxo,
ULONG iMode,
ULONG cPoints,
PVOID pvIn,
PVOID pvOut)
{
if (pxo == NULL)
return(FALSE);
if ((pvIn == NULL) || (pvOut == NULL))
return(FALSE);
if (iMode == XF_LTOL)
{
if (pvIn == pvOut)
return(((EXFORMOBJ *)pxo)->bXform((PPOINTL)pvIn,(UINT)cPoints));
if (((EXFORMOBJ *)pxo)->bXform((PPOINTL)pvIn, (PPOINTFIX)pvOut,
(UINT)cPoints))
{
PPOINTL pptl = (PPOINTL)pvOut;
PPOINTL pptlEnd = pptl + cPoints;
while (pptl < pptlEnd)
{
pptl->x = (pptl->x + 8) >> 4; // FXTOLROUND
pptl->y = (pptl->y + 8) >> 4; // FXTOLROUND
pptl++;
}
return(TRUE);
}
return(FALSE);
}
if (iMode == XF_LTOFX)
return(((EXFORMOBJ *)pxo)->bXform((PPOINTL)pvIn, (PPOINTFIX)pvOut,
(UINT)cPoints));
MATRIX mx;
EXFORMOBJ xo(&mx, DONT_COMPUTE_FLAGS);
if (xo.bInverse(*((EXFORMOBJ *)pxo)))
{
if (iMode == XF_INV_LTOL)
{
if (pvIn == pvOut)
return(xo.bXform((PPOINTL)pvIn,(UINT)cPoints));
PPOINTL pptl = (PPOINTL)pvIn;
PPOINTL pptlEnd = pptl + cPoints;
while (pptl < pptlEnd)
{
pptl->x <<= 4;
pptl->y <<= 4;
pptl++;
}
BOOL bRet = xo.bXform((PPOINTFIX)pvIn, (PPOINTL)pvOut, (UINT)cPoints);
pptl = (PPOINTL)pvIn;
while (pptl < pptlEnd)
{
pptl->x >>= 4;
pptl->y >>= 4;
pptl++;
}
return(bRet);
}
if (iMode == XF_INV_FXTOL)
return(xo.bXform((PPOINTFIX)pvIn, (PPOINTL)pvOut, (UINT)cPoints));
}
return(FALSE);
}
/******************************Public*Routine******************************\
* ULONG XFORMOBJ_iGetXform(XFORMOBJ *pxo,XFORM *pxform)
*
* Get the coefficients of the given transform.
*
* History:
* 13-May-1991 -by- Wendy Wu [wendywu]
* Wrote it.
\**************************************************************************/
ULONG XFORMOBJ_iGetXform(XFORMOBJ *pxo, XFORML *pxform)
{
if (pxo == NULL)
return(DDI_ERROR);
if (pxform != NULL)
((EXFORMOBJ *)pxo)->vGetCoefficient((XFORML *)pxform);
switch(((EXFORMOBJ *)pxo)->flAccel() &
(XFORM_SCALE|XFORM_UNITY|XFORM_NO_TRANSLATION))
{
case (XFORM_SCALE|XFORM_UNITY|XFORM_NO_TRANSLATION):
return(GX_IDENTITY);
case (XFORM_SCALE|XFORM_UNITY):
return(GX_OFFSET);
case (XFORM_SCALE):
return(GX_SCALE);
default:
return(GX_GENERAL);
}
}
/******************************Public*Routine******************************\
* ULONG XFORMOBJ_iGetXform(XFORMOBJ *pxo,XFORM *pxform)
*
* Get the coefficients of the given transform.
*
* History:
* 13-May-1991 -by- Wendy Wu [wendywu]
* Wrote it.
\**************************************************************************/
ULONG XFORMOBJ_iGetFloatObjXform(XFORMOBJ *pxo, FLOATOBJ_XFORM *pxform)
{
if (pxo == NULL)
return(DDI_ERROR);
if (pxform != NULL)
((EXFORMOBJ *)pxo)->vGetCoefficient(pxform);
switch(((EXFORMOBJ *)pxo)->flAccel() &
(XFORM_SCALE|XFORM_UNITY|XFORM_NO_TRANSLATION))
{
case (XFORM_SCALE|XFORM_UNITY|XFORM_NO_TRANSLATION):
return(GX_IDENTITY);
case (XFORM_SCALE|XFORM_UNITY):
return(GX_OFFSET);
case (XFORM_SCALE):
return(GX_SCALE);
default:
return(GX_GENERAL);
}
}
/******************************Public*Routine******************************\
*
* a few wrapper functions for EFLOATS. See winddi for the list.
*
* Note that currently these are only defined for x86 since we allow floating
* point operations in the kernel for MIPS, ALPHA, and PPC where these are macros.
*
* History:
* 16-Mar-1995 -by- Eric Kutter [erick]
* Wrote it.
\**************************************************************************/
#if defined(_X86_) && !defined(BUILD_WOW6432)
VOID FLOATOBJ_SetFloat(
PFLOATOBJ pf,
FLOATL f)
{
*(EFLOAT*)pf = f;
}
VOID FLOATOBJ_SetLong(
PFLOATOBJ pf,
LONG l)
{
*(EFLOAT*)pf = l;
}
LONG FLOATOBJ_GetFloat(
PFLOATOBJ pf)
{
return(((EFLOAT*)pf)->lEfToF());
}
LONG FLOATOBJ_GetLong(
PFLOATOBJ pf)
{
LONG l;
((EFLOAT*)pf)->bEfToLTruncate(l);
return(l);
}
VOID FLOATOBJ_AddFloat(
PFLOATOBJ pf,
FLOATL f)
{
EFLOAT ef;
ef = f;
*(EFLOAT*)pf += ef;
}
VOID FLOATOBJ_AddLong(
PFLOATOBJ pf,
LONG l)
{
EFLOAT ef;
ef = l;
*(EFLOAT*)pf += ef;
}
VOID FLOATOBJ_Add(
PFLOATOBJ pf,
PFLOATOBJ pf1)
{
*(EFLOAT*)pf += *(EFLOAT*)pf1;
}
VOID FLOATOBJ_AddFloatObj(
PFLOATOBJ pf,
PFLOATOBJ pf1)
{
*(EFLOAT*)pf += *(EFLOAT*)pf1;
}
VOID FLOATOBJ_SubFloat(
PFLOATOBJ pf,
FLOATL f)
{
EFLOAT ef;
ef = f;
*(EFLOAT*)pf -= ef;
}
VOID FLOATOBJ_SubLong(
PFLOATOBJ pf,
LONG l)
{
EFLOAT ef;
ef = l;
*(EFLOAT*)pf -= ef;
}
VOID FLOATOBJ_Sub(
PFLOATOBJ pf,
PFLOATOBJ pf1)
{
*(EFLOAT*)pf -= *(EFLOAT*)pf1;
}
VOID FLOATOBJ_SubFloatObj(
PFLOATOBJ pf,
PFLOATOBJ pf1)
{
*(EFLOAT*)pf -= *(EFLOAT*)pf1;
}
VOID FLOATOBJ_MulFloat(
PFLOATOBJ pf,
FLOATL f)
{
EFLOAT ef;
ef = f;
*(EFLOAT*)pf *= ef;
}
VOID FLOATOBJ_MulLong(
PFLOATOBJ pf,
LONG l)
{
EFLOAT ef;
ef = l;
*(EFLOAT*)pf *= ef;
}
VOID FLOATOBJ_MulFloatObj(
PFLOATOBJ pf,
PFLOATOBJ pf1)
{
*(EFLOAT*)pf *= *(EFLOAT*)pf1;
}
VOID FLOATOBJ_Mul(
PFLOATOBJ pf,
PFLOATOBJ pf1)
{
*(EFLOAT*)pf *= *(EFLOAT*)pf1;
}
VOID FLOATOBJ_DivFloat(
PFLOATOBJ pf,
FLOATL f)
{
EFLOAT ef;
ef = f;
*(EFLOAT*)pf /= ef;
}
VOID FLOATOBJ_DivLong(
PFLOATOBJ pf,
LONG l)
{
EFLOAT ef;
ef = l;
*(EFLOAT*)pf /= ef;
}
VOID FLOATOBJ_Div(
PFLOATOBJ pf,
PFLOATOBJ pf1)
{
*(EFLOAT*)pf /= *(EFLOAT*)pf1;
}
VOID FLOATOBJ_DivFloatObj(
PFLOATOBJ pf,
PFLOATOBJ pf1)
{
*(EFLOAT*)pf /= *(EFLOAT*)pf1;
}
VOID FLOATOBJ_Neg(PFLOATOBJ pf)
{
((EFLOAT*)pf)->vNegate();
}
BOOL FLOATOBJ_EqualLong(
PFLOATOBJ pf,
LONG l)
{
if (l == 0)
{
return(((EFLOAT*)pf)->bIsZero());
}
else
{
EFLOAT ef;
ef = l;
return(*(EFLOAT*)pf == ef);
}
}
BOOL FLOATOBJ_GreaterThanLong(
PFLOATOBJ pf,
LONG l)
{
if (l == 0)
{
return(!((EFLOAT*)pf)->bIsNegative() && !((EFLOAT*)pf)->bIsZero());
}
else
{
EFLOAT ef;
ef = l;
return(*(EFLOAT*)pf > ef);
}
}
BOOL FLOATOBJ_LessThanLong(
PFLOATOBJ pf,
LONG l)
{
if (l == 0)
{
return(((EFLOAT*)pf)->bIsNegative());
}
else
{
EFLOAT ef;
ef = l;
return(*(EFLOAT*)pf < ef);
}
}
BOOL FLOATOBJ_Equal(
PFLOATOBJ pf,
PFLOATOBJ pf1)
{
return(*(EFLOAT*)pf == *(EFLOAT*)pf1);
}
BOOL FLOATOBJ_GreaterThan(
PFLOATOBJ pf,
PFLOATOBJ pf1)
{
return(*(EFLOAT*)pf > *(EFLOAT*)pf1);
}
BOOL FLOATOBJ_LessThan(
PFLOATOBJ pf,
PFLOATOBJ pf1)
{
return(*(EFLOAT*)pf < *(EFLOAT*)pf1);
}
#endif _x86_