Exemplo n.º 1
0
void TShearY( LPTFORM lpTForm, int width, int dy )
/***********************************************************************/
{
    LFIXED a;
    unsigned int h;

    h = lsqrt(((long)width * (long)width) + ((long)dy * (long)dy));
    a = FGET(dy, h);

    lpTForm->ay += FIXMUL( lpTForm->ax, a );
    lpTForm->by += FIXMUL( lpTForm->bx, a );
    lpTForm->cy += FIXMUL( lpTForm->cx, a );
}
Exemplo n.º 2
0
void TShearX( LPTFORM lpTForm, int height, int dx )
/***********************************************************************/
{
    LFIXED b;
    unsigned int h;

    h = lsqrt(((long)height * (long)height) + ((long)dx * (long)dx));
    b = FGET(dx, h);

    lpTForm->ax += FIXMUL( lpTForm->ay, b );
    lpTForm->bx += FIXMUL( lpTForm->by, b );
    lpTForm->cx += FIXMUL( lpTForm->cy, b );
}
Exemplo n.º 3
0
void TScale( LPTFORM lpTForm, LFIXED sx, LFIXED sy )
/***********************************************************************/
{
    if ( sx && (sx != FUNITY) )
    {
        lpTForm->ax = FIXMUL( lpTForm->ax, sx );
        lpTForm->bx = FIXMUL( lpTForm->bx, sx );
        lpTForm->cx = FIXMUL( lpTForm->cx, sx );
    }

    if ( sy && (sy != FUNITY) )
    {
        lpTForm->ay = FIXMUL( lpTForm->ay, sy );
        lpTForm->by = FIXMUL( lpTForm->by, sy );
        lpTForm->cy = FIXMUL( lpTForm->cy, sy );
    }
}
Exemplo n.º 4
0
void TInvert( LPTFORM lpTForm )
/***********************************************************************/
{
    LFIXED ax, bx, cx, ay, by, cy;
    LFIXED term1, term2, term3;

    ax = lpTForm->ax;
    ay = lpTForm->ay;
    bx = lpTForm->bx;
    by = lpTForm->by;
    cx = lpTForm->cx;
    cy = lpTForm->cy;

    /* ax*by - bx*ay */	term1 = FIXMUL( ax, by ) - FIXMUL( bx, ay );
    /* cy*bx - cx*by */	term2 = FIXMUL( cy, bx ) - FIXMUL( cx, by );
    /* cx*ay - cy*ax */	term3 = FIXMUL( cx, ay ) - FIXMUL( cy, ax );
    lpTForm->ax = FGET(    by, term1 );
    lpTForm->bx = FGET(   -bx, term1 );
    lpTForm->cx = FGET( term2, term1 );

    lpTForm->ay = FGET(   -ay, term1 );
    lpTForm->by = FGET(    ax, term1 );
    lpTForm->cy = FGET( term3, term1 );
}
Exemplo n.º 5
0
void TMultiply( LPTFORM lpTFormS1, LPTFORM lpTFormS2, LPTFORM lpTFormD)
/***********************************************************************/
{
    lpTFormD->ax = FIXMUL(lpTFormS1->ax, lpTFormS2->ax) +
                   FIXMUL(lpTFormS1->ay, lpTFormS2->bx);
    lpTFormD->bx = FIXMUL(lpTFormS1->bx, lpTFormS2->ax) +
                   FIXMUL(lpTFormS1->by, lpTFormS2->bx);
    lpTFormD->cx = FIXMUL(lpTFormS1->cx, lpTFormS2->ax) +
                   FIXMUL(lpTFormS1->cy, lpTFormS2->bx) +
                   lpTFormS2->cx;
    lpTFormD->ay = FIXMUL(lpTFormS1->ax, lpTFormS2->ay) +
                   FIXMUL(lpTFormS1->ay, lpTFormS2->by);
    lpTFormD->by = FIXMUL(lpTFormS1->bx, lpTFormS2->ay) +
                   FIXMUL(lpTFormS1->by, lpTFormS2->by);
    lpTFormD->cy = FIXMUL(lpTFormS1->cx, lpTFormS2->ay) +
                   FIXMUL(lpTFormS1->cy, lpTFormS2->by) +
                   lpTFormS2->cy;
}
Exemplo n.º 6
0
void TRotate( LPTFORM lpTForm, LFIXED anglex, LFIXED angley )
/***********************************************************************/
{
    LFIXED sinx, cosx, siny, cosy;
    LFIXED ax, bx, cx;

    SinCos( anglex, &sinx, &cosx );
    SinCos( angley, &siny, &cosy );

    ax = lpTForm->ax;
    bx = lpTForm->bx;
    cx = lpTForm->cx;

    if ( siny || cosx )
    {
        lpTForm->ax = FIXMUL( ax, cosx ) - FIXMUL( lpTForm->ay, siny );
        lpTForm->bx = FIXMUL( bx, cosx ) - FIXMUL( lpTForm->by, siny );
        lpTForm->cx = FIXMUL( cx, cosx ) - FIXMUL( lpTForm->cy, siny );
    }

    if ( cosy || sinx )
    {
        lpTForm->ay = FIXMUL( ax, sinx ) + FIXMUL( lpTForm->ay, cosy );
        lpTForm->by = FIXMUL( bx, sinx ) + FIXMUL( lpTForm->by, cosy );
        lpTForm->cy = FIXMUL( cx, sinx ) + FIXMUL( lpTForm->cy, cosy );
    }
}
Exemplo n.º 7
0
//=======================================================================
// 	int CurveToPoints
//		lpPoints:  Bezier handle points.
//		type:  BEZIER_MARKER is the only type supported.
//		lpOutputPoints:  Result. - must be at least MAX_BEZIER_OUT or NULL
//		
//		returns the number of points written (or needed if !lpOutputPoints)
//=======================================================================
int CurveToPoints(LPPOINT lpPoints, int type, LPPOINT lpOutputPoints )
//=======================================================================
{
	int n, t, i, nOutPoints, lastx, lasty, x, y;
	int nMaxPoints;
	int nPoints;
	LFIXED tscale, fdx, fdy, tscalebase;
	FPOINT ptR[MAX_BEZIER_IN];
	LPFPOINT R;
	LPPOINT P;

	if (type != BEZIER_MARKER)
		return(0);
	nPoints = BEZIER_IN;
	
	// determine the maximum number of points we will want (may effect quality)
	x = y = INT_MAX; 
	lastx = lasty = INT_MIN;
	for (i=0;i<nPoints;i++)
	{
		x = min(x, lpPoints[i].x);
		y = min(y, lpPoints[i].y);
		lastx = max(lastx, lpPoints[i].x);
		lasty = max(lasty, lpPoints[i].y);
	}
	// get delta
	x = lastx-x;
	y = lasty-y;
	nMaxPoints = (x+y)/4;
	nMaxPoints = bound(nMaxPoints, 5, MAX_BEZIER_OUT);
	
//	Transformer(lpTForm, lpPoints, &lastx, &lasty);
	if (lpOutputPoints)
		*lpOutputPoints++ = *lpPoints; //lastx,lasty;
	nOutPoints = 1;
	
	tscalebase = FGET( 1, nMaxPoints );
	tscale = 0;
	
	for ( t=1; t<nMaxPoints; t++ )
	{
		R = ptR;
		P = lpPoints;
		n = nPoints;
		tscale += tscalebase;
		while (--n >= 0)
		{
//			FTransformer(lpTForm, P, &R->fx, &R->fy);
			R->fx = MAKEFIXED(P->x);
			R->fy = MAKEFIXED(P->y);
			R++;
			P++;
		}
		n = nPoints - 1;
		while ( --n >= 0 )
		{
			R = ptR;
			for ( i=0; i<=n; i++ )
			{
				fdx = (R+1)->fx - R->fx;
				fdy = (R+1)->fy - R->fy;
				R->fx += FIXMUL( fdx, tscale );
				R->fy += FIXMUL( fdy, tscale );
				R++;
			}
		}
		x = WHOLE(ptR[0].fx);
		y = WHOLE(ptR[0].fy);
		if (x != lastx || y != lasty)
		{
			lastx = x;
			lasty = y;
			if (lpOutputPoints)
			{
				lpOutputPoints->x = lastx;
				lpOutputPoints->y = lasty;
				lpOutputPoints++;
			}
			++nOutPoints;
		}
	}
	
	n = nPoints - 1;
	x = WHOLE(ptR[n].fx);
	y = WHOLE(ptR[n].fy);
	if (x != lastx || y != lasty)
	{
		if (lpOutputPoints)
		{
			lpOutputPoints->x = x;
			lpOutputPoints->y = y;
		}
		++nOutPoints;
	}
	return( nOutPoints );
}