|
|
/******************************Module*Header*******************************\
* Module Name: fill.hxx * * (Brief description) * * Created: 06-Oct-1993 09:11:17 * Author: Eric Kutter [erick] * * Copyright (c) 1993-1999 Microsoft Corporation * * (General description of its use) * * Dependencies: * * (#defines) * (#includes) * \**************************************************************************/
/**************************************************************************\
* * Slow fill stuff * \**************************************************************************/
class EDGE; typedef EDGE *PEDGE;
class EDGE { public: PEDGE pNext; LONG lScansLeft; LONG X; LONG Y; LONG lErrorTerm; LONG lErrorAdjustUp; LONG lErrorAdjustDown; LONG lXWhole; LONG lXDirection; LONG lWindingDirection; };
#define MAX_POINTS 20
/**************************************************************************\
* * FastFill stuff * \**************************************************************************/
// The x86 C compiler insists on making a divide and modulus operation
// into two DIVs, when it can in fact be done in one. So we use this macro.
//
// Note: QUOTIENT_REMAINDER implicitly takes unsigned arguments
//#if defined(_X86_) || defined(i386)
#if 0
#define QUOTIENT_REMAINDER(ulNumerator, ulDenominator, ulQuotient, ulRemainder) \
__asm mov eax, ulNumerator \ __asm sub edx, edx \ __asm div ulDenominator \ __asm mov ulQuotient, eax \ __asm mov ulRemainder, edx
#else
#define QUOTIENT_REMAINDER(ulNumerator, ulDenominator, ulQuotient, ulRemainder) \
ulQuotient = (ULONG) ulNumerator / (ULONG) ulDenominator; \ ulRemainder = (ULONG) ulNumerator % (ULONG) ulDenominator;
#endif
typedef struct _EDGEDATA { LONG x; // Current x position
LONG dx; // # pixels to advance x on each scan
LONG lError; // Current DDA error
LONG lErrorUp; // DDA error increment on each scan
LONG lErrorDown; // DDA error adjustment
POINTFIX* pptfx; // Points to start of current edge
LONG dptfx; // Delta (in bytes) from pptfx to next point
LONG cy; // Number of scans to go for this edge
} EDGEDATA; /* ed, ped */
/**************************************************************************\
* * \**************************************************************************/
VOID vMoveNewEdges(EDGE *pGETHead, EDGE *pAETHead, LONG lyCurrent); VOID vXSortAETEdges(EDGE *pAETHead); VOID vAdvanceAETEdges(EDGE *pAETHead); VOID vConstructGET(EPATHOBJ& po, EDGE *pGETHead, EDGE *pFreeEdges,RECTL *pBound); PEDGE AddEdgeToGET(EDGE *pGETHead, EDGE *pFreeEdge, POINTFIX *ppfxEdgeStart, POINTFIX *ppfxEdgeEnd);
LONG EngFastFill( SURFOBJ *pso, PATHOBJ *ppo, PRECTL prcl, BRUSHOBJ *pdbrush, POINTL *pptlBrush, MIX mix, FLONG flOptions);
|