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
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_
|