Exemplo n.º 1
0
/*
 * Inline helper to calculate pfo1 * l2 + pfo3 * l4
 */
FORCEINLINE
VOID
MulAddLong(
    PFLOATOBJ pfoDest,
    PFLOATOBJ pfo1,
    LONG l2,
    PFLOATOBJ pfo3,
    LONG l4)
{
    FLOATOBJ foTmp;

    *pfoDest = *pfo1;
    FLOATOBJ_MulLong(pfoDest, l2);
    foTmp = *pfo3;
    FLOATOBJ_MulLong(&foTmp, l4);
    FLOATOBJ_Add(pfoDest, &foTmp);
}
Exemplo n.º 2
0
LONG lMulFloatLong(
    PFLOATOBJ pfo,
    LONG l)
{
    FLOATOBJ fo;
    fo = *pfo;
    FLOATOBJ_MulLong(&fo,l);
    FLOATOBJ_AddFloat(&fo,(FLOAT)0.5);
    return(FLOATOBJ_GetLong(&fo));
}
Exemplo n.º 3
0
BOOL
NTAPI
XFORMOBJ_bXformFixPoints(
    IN XFORMOBJ  *pxo,
    IN ULONG  cPoints,
    IN PPOINTL  pptIn,
    OUT PPOINTL  pptOut)
{
    PMATRIX pmx;
    INT i;
    FLOATOBJ fo1, fo2;
    FLONG flAccel;

    pmx = XFORMOBJ_pmx(pxo);
    flAccel = pmx->flAccel;

    if ((flAccel & (XFORM_SCALE|XFORM_UNITY)) == (XFORM_SCALE|XFORM_UNITY))
    {
        /* Identity transformation, nothing todo */
    }
    else if (flAccel & XFORM_INTEGER)
    {
        if (flAccel & XFORM_UNITY)
        {
            /* 1-scale integer transform */
            LONG lM12 = FLOATOBJ_GetLong(&pmx->efM12);
            LONG lM21 = FLOATOBJ_GetLong(&pmx->efM21);

            i = cPoints - 1;
            do
            {
                LONG x = pptIn[i].x + pptIn[i].y * lM21;
                LONG y = pptIn[i].y + pptIn[i].x * lM12;
                pptOut[i].y = y;
                pptOut[i].x = x;
            }
            while (--i >= 0);
        }
        else if (flAccel & XFORM_SCALE)
        {
            /* Diagonal integer transform */
            LONG lM11 = FLOATOBJ_GetLong(&pmx->efM11);
            LONG lM22 = FLOATOBJ_GetLong(&pmx->efM22);

            i = cPoints - 1;
            do
            {
                pptOut[i].x = pptIn[i].x * lM11;
                pptOut[i].y = pptIn[i].y * lM22;
            }
            while (--i >= 0);
        }
        else
        {
            /* Full integer transform */
            LONG lM11 = FLOATOBJ_GetLong(&pmx->efM11);
            LONG lM12 = FLOATOBJ_GetLong(&pmx->efM12);
            LONG lM21 = FLOATOBJ_GetLong(&pmx->efM21);
            LONG lM22 = FLOATOBJ_GetLong(&pmx->efM22);

            i = cPoints - 1;
            do
            {
                LONG x;
                x  = pptIn[i].x * lM11;
                x += pptIn[i].y * lM21;
                pptOut[i].y  = pptIn[i].y * lM22;
                pptOut[i].y += pptIn[i].x * lM12;
                pptOut[i].x = x;
            }
            while (--i >= 0);
        }
    }
    else if (flAccel & XFORM_UNITY)
    {
        /* 1-scale transform */
        i = cPoints - 1;
        do
        {
            fo1 = pmx->efM21;
            FLOATOBJ_MulLong(&fo1, pptIn[i].y);
            fo2 = pmx->efM12;
            FLOATOBJ_MulLong(&fo2, pptIn[i].x);
            pptOut[i].x = pptIn[i].x + FLOATOBJ_GetLong(&fo1);
            pptOut[i].y = pptIn[i].y + FLOATOBJ_GetLong(&fo2);
        }
        while (--i >= 0);
    }
    else if (flAccel & XFORM_SCALE)
    {
        /* Diagonal float transform */
        i = cPoints - 1;
        do
        {
            fo1 = pmx->efM11;
            FLOATOBJ_MulLong(&fo1, pptIn[i].x);
            pptOut[i].x = FLOATOBJ_GetLong(&fo1);
            fo2 = pmx->efM22;
            FLOATOBJ_MulLong(&fo2, pptIn[i].y);
            pptOut[i].y = FLOATOBJ_GetLong(&fo2);
        }
        while (--i >= 0);
    }
    else
    {
        /* Full float transform */
        i = cPoints - 1;
        do
        {
            MulAddLong(&fo1, &pmx->efM11, pptIn[i].x, &pmx->efM21, pptIn[i].y);
            MulAddLong(&fo2, &pmx->efM12, pptIn[i].x, &pmx->efM22, pptIn[i].y);
            pptOut[i].x = FLOATOBJ_GetLong(&fo1);
            pptOut[i].y = FLOATOBJ_GetLong(&fo2);
        }
        while (--i >= 0);
    }

    if (!(pmx->flAccel & XFORM_NO_TRANSLATION))
    {
        /* Translate points */
        i = cPoints - 1;
        do
        {
            pptOut[i].x += pmx->fxDx;
            pptOut[i].y += pmx->fxDy;
        }
        while (--i >= 0);
    }

    return TRUE;
}