/******************************Module*Header*******************************\ * Module Name: fontmath.cxx * * math stuff needed by ttfd which uses efloat routines * * Created: 04-Apr-1992 10:31:49 * Author: Bodin Dresevic [BodinD] * * Copyright (c) 1990 Microsoft Corporation * * \**************************************************************************/ extern "C" { #define __CPLUSPLUS #include }; #include "engine.hxx" #include "equad.hxx" /******************************Public*Routine******************************\ * * bFDXform, transform an array of points, output in POINTFIX * * Effects: * * Warnings: * * History: * 05-Apr-1992 -by- Bodin Dresevic [BodinD] * Wrote it. \**************************************************************************/ extern "C" BOOL bFDXform( XFORML *pxf , POINTFIX *pptfxDst , POINTL *pptlSrc , SIZE_T c ) { BOOL bRet; EFLOAT ef11; EFLOAT ef12; EFLOAT ef21; EFLOAT ef22; ef11 = pxf->eM11; ef12 = pxf->eM12; ef21 = pxf->eM21; ef22 = pxf->eM22; bRet = FALSE; if ( ef12.bIsZero() && ef21.bIsZero()) { for ( ; c ; pptfxDst++, pptlSrc++, c--) { EFLOAT ef; ef = pptlSrc->x; ef *= ef11; if ( !ef.bEfToFx( pptfxDst->x )) { break; } ef = pptlSrc->y; ef *= ef22; if ( !ef.bEfToFx( pptfxDst->y )) { break; } } bRet = TRUE; } else { for ( ; c ; pptfxDst++, pptlSrc++, c--) { EFLOAT efX; EFLOAT efY; EFLOAT ef1; EFLOAT ef2; efX = pptlSrc->x; efY = pptlSrc->y; ef1 = efX; ef1 *= ef11; ef2 = efY; ef2 *= ef21; ef2 += ef1; if ( !ef2.bEfToFx( pptfxDst->x )) { break; } ef1 = efX; ef1 *= ef12; ef2 = efY; ef2 *= ef22; ef2 += ef1; if ( !ef2.bEfToFx( pptfxDst->y )) { break; } } bRet = TRUE; } return( bRet ); } /******************************Public*Routine******************************\ * * bXformUnitVector * * xform vector by pfdxo, compute the unit vector of the transformed * vector and the norm of the transformed vector. Norm and the transformed * vector are multiplied by 16 so that when converting to long the result * will acutally be a 28.4 fix * * Effects: * * Warnings: * * History: * 01-Apr-1992 -by- Bodin Dresevic [BodinD] * Wrote it. \**************************************************************************/ extern "C" BOOL bXformUnitVector( POINTL *pptl // IN incoming unit vector , XFORML *pxf // IN xform to use , PVECTORFL pvtflXformed // OUT xform of the incoming unit vector , POINTE *ppteUnit // OUT *pptqXormed/|*pptqXormed|, POINTE , EPOINTQF *pptqUnit // OUT the same as pteUnit, diff format , EFLOAT *pefNorm // OUT |*pptqXormed| ) { EFLOAT efX_; EFLOAT efY_; BOOL b = TRUE; EFLOAT ef11; EFLOAT ef12; EFLOAT ef21; EFLOAT ef22; EFLOAT efX; EFLOAT efY; // // Convert longs to FIX point // efX = 16 * pptl->x; efY = 16 * pptl->y; // // Convert the matrix elements from FLOAT to EFLOAT // ef11 = pxf->eM11; ef12 = pxf->eM12; ef21 = pxf->eM21; ef22 = pxf->eM22; // // Transform the vector and put the result in efX_ and efY_ // if ( ef12.bIsZero() && ef21.bIsZero() ) { efX_ = efX; efX_ *= ef11; efY_ = efY; efY_ *= ef22; } else { EFLOAT ef; efX_ = efX; efX_ *= ef11; ef = efY; ef *= ef21; efX_ += ef; ef = efX; ef *= ef12; efY_ = efY; efY_ *= ef22; efY_ += ef; } // // Record the results // pvtflXformed->x = efX_; pvtflXformed->y = efY_; // get the norm efX_ *= efX_; efY_ *= efY_; efX_ += efY_; efX_.vSqrt(); *pefNorm = efX_; // make a unit vector out of eptfl EVECTORFL vtfl; vtfl.x.eqDiv(pvtflXformed->x,*pefNorm); vtfl.y.eqDiv(pvtflXformed->y,*pefNorm); vtfl.x.vEfToF(ppteUnit->x); vtfl.y.vEfToF(ppteUnit->y); // compute this same quantity in POINTQF format if requasted to do so: if (pptqUnit != (EPOINTQF *)NULL) { vtfl.x.vTimes16(); vtfl.y.vTimes16(); // convert to 28.36 format. The incoming vector is already // multliplied by 16 to ensure that the result is in the 28.36 *pptqUnit = vtfl; } return b; } /******************************Public*Routine******************************\ * * vLTimesVtfl * * Effects: * * Warnings: * * History: * 05-Apr-1992 -by- Bodin Dresevic [BodinD] * Wrote it. \**************************************************************************/ extern "C" VOID vLTimesVtfl // *pptq = l * pvtfl, *pptq is in 28.36 format ( LONG l, VECTORFL *pvtfl, EPOINTQF *pptq ) { EVECTORFL vtfl; EFLOAT ef; ef = l; vtfl.x.eqMul(pvtfl->x,ef); vtfl.y.eqMul(pvtfl->y,ef); // convert to 28.36 format. The incoming vector will already have been // multliplied by 16 to ensure that the result is in the 28.36 *pptq = vtfl; } /******************************Public*Routine******************************\ * * fxLTimesEf * * Effects: * * Warnings: * * History: * 05-Apr-1992 -by- Bodin Dresevic [BodinD] * Wrote it. \**************************************************************************/ extern "C" FIX fxLTimesEf ( EFLOAT *pef, LONG l ) { // *pef is a norm, already multiplied by 16 to ensure that the result // is in 28.4 format l = lCvt((*pef), l); return (FIX)l; } /******************************Public*Routine******************************\ * * Routine Name: * * vLToE * * Routine Description: * * Arguments: * * Called by: * * Return Value: * \**************************************************************************/ extern "C" VOID vLToE(FLOATL *pe, LONG l) { EFLOAT ef; ef = l; ef.vEfToF(*pe); }