mirror of
https://github.com/reactos/reactos.git
synced 2025-05-22 02:25:18 +00:00
[WIN32SS][NTGDI] Strictly check in XFORMOBJ_iSetXform (#1676)
Check if the determinant of the given transformation matrix is non-zero. If zero, the function returns DDI_ERROR without change. CORE-15554
This commit is contained in:
parent
ede3fddad7
commit
bf06c94e15
1 changed files with 44 additions and 16 deletions
|
@ -104,12 +104,9 @@ HintFromAccel(ULONG flAccel)
|
||||||
/** Internal functions ********************************************************/
|
/** Internal functions ********************************************************/
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
NTAPI
|
FASTCALL
|
||||||
XFORMOBJ_UpdateAccel(
|
MX_UpdateAccel(IN OUT PMATRIX pmx)
|
||||||
IN OUT XFORMOBJ *pxo)
|
|
||||||
{
|
{
|
||||||
PMATRIX pmx = XFORMOBJ_pmx(pxo);
|
|
||||||
|
|
||||||
/* Copy Dx and Dy to FIX format */
|
/* Copy Dx and Dy to FIX format */
|
||||||
pmx->fxDx = FLOATOBJ_GetFix(&pmx->efDx);
|
pmx->fxDx = FLOATOBJ_GetFix(&pmx->efDx);
|
||||||
pmx->fxDy = FLOATOBJ_GetFix(&pmx->efDy);
|
pmx->fxDy = FLOATOBJ_GetFix(&pmx->efDy);
|
||||||
|
@ -143,6 +140,16 @@ XFORMOBJ_UpdateAccel(
|
||||||
return HintFromAccel(pmx->flAccel);
|
return HintFromAccel(pmx->flAccel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
XFORMOBJ_UpdateAccel(
|
||||||
|
IN OUT XFORMOBJ *pxo)
|
||||||
|
{
|
||||||
|
PMATRIX pmx = XFORMOBJ_pmx(pxo);
|
||||||
|
|
||||||
|
return MX_UpdateAccel(pmx);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
NTAPI
|
NTAPI
|
||||||
|
@ -150,24 +157,45 @@ XFORMOBJ_iSetXform(
|
||||||
IN OUT XFORMOBJ *pxo,
|
IN OUT XFORMOBJ *pxo,
|
||||||
IN const XFORML *pxform)
|
IN const XFORML *pxform)
|
||||||
{
|
{
|
||||||
PMATRIX pmx = XFORMOBJ_pmx(pxo);
|
PMATRIX pmx;
|
||||||
|
MATRIX mxTemp;
|
||||||
|
ULONG Hint;
|
||||||
|
|
||||||
/* Check parameters */
|
/* Check parameters */
|
||||||
if (!pxo || !pxform) return DDI_ERROR;
|
if (!pxo || !pxform) return DDI_ERROR;
|
||||||
|
|
||||||
/* Check if the xform is valid */
|
|
||||||
if ((pxform->eM11 == 0) || (pxform->eM22 == 0)) return DDI_ERROR;
|
|
||||||
|
|
||||||
/* Copy members */
|
/* Copy members */
|
||||||
FLOATOBJ_SetFloat(&pmx->efM11, pxform->eM11);
|
FLOATOBJ_SetFloat(&mxTemp.efM11, pxform->eM11);
|
||||||
FLOATOBJ_SetFloat(&pmx->efM12, pxform->eM12);
|
FLOATOBJ_SetFloat(&mxTemp.efM12, pxform->eM12);
|
||||||
FLOATOBJ_SetFloat(&pmx->efM21, pxform->eM21);
|
FLOATOBJ_SetFloat(&mxTemp.efM21, pxform->eM21);
|
||||||
FLOATOBJ_SetFloat(&pmx->efM22, pxform->eM22);
|
FLOATOBJ_SetFloat(&mxTemp.efM22, pxform->eM22);
|
||||||
FLOATOBJ_SetFloat(&pmx->efDx, pxform->eDx);
|
FLOATOBJ_SetFloat(&mxTemp.efDx, pxform->eDx);
|
||||||
FLOATOBJ_SetFloat(&pmx->efDy, pxform->eDy);
|
FLOATOBJ_SetFloat(&mxTemp.efDy, pxform->eDy);
|
||||||
|
|
||||||
/* Update accelerators and return complexity */
|
/* Update accelerators and return complexity */
|
||||||
return XFORMOBJ_UpdateAccel(pxo);
|
Hint = MX_UpdateAccel(&mxTemp);
|
||||||
|
|
||||||
|
/* Check whether det = (M11 * M22 - M12 * M21) is non-zero */
|
||||||
|
if (Hint == GX_SCALE)
|
||||||
|
{
|
||||||
|
if (FLOATOBJ_Equal0(&mxTemp.efM11) || FLOATOBJ_Equal0(&mxTemp.efM22))
|
||||||
|
{
|
||||||
|
return DDI_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Hint == GX_GENERAL)
|
||||||
|
{
|
||||||
|
if (!MX_IsInvertible(&mxTemp))
|
||||||
|
{
|
||||||
|
return DDI_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Store */
|
||||||
|
pmx = XFORMOBJ_pmx(pxo);
|
||||||
|
*pmx = mxTemp;
|
||||||
|
|
||||||
|
return Hint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue