/******************************Module*Header*******************************\ * Module Name: mcdline.c * * Contains all of the line-rendering routines for the Millenium MCD driver. * * Copyright (c) 1996 Microsoft Corporation \**************************************************************************/ #include "precomp.h" #include "mcdhw.h" #include "mcdutil.h" #include "mcdmath.h" //#undef CHECK_FIFO_FREE //#define CHECK_FIFO_FREE VOID FASTCALL __MCDRenderFlatLine(DEVRC *pRc, MCDVERTEX *a, MCDVERTEX *b, BOOL resetLine) { PDEV *ppdev = pRc->ppdev; BYTE *pjBase = ppdev->pjBase; ULONG clipNum; RECTL *pClip; MCDFLOAT invLength; MCDCOLOR *ac; LONG ix0, ix1, iy0, iy1; LONG idx, idy; LONG absIdx, absIdy; LONG x0frac, x1frac, y0frac, y1frac, totDist; LONG numPixels; LARGE_INTEGER idz, iZStart; LONG err; ULONG signs; ULONG adjust = 0; LONG majorInc; LONG minorInc; if ((clipNum = pRc->pEnumClip->c) > 1) { pClip = &pRc->pEnumClip->arcl[0]; (*pRc->HWSetupClipRect)(pRc, pClip++); } x0frac = __MCD_VERTEX_FLOAT_FRACTION(a->windowCoord.x); y0frac = __MCD_VERTEX_FLOAT_FRACTION(a->windowCoord.y); ix0 = __MCD_VERTEX_FLOAT_TO_INT(a->windowCoord.x); iy0 = __MCD_VERTEX_FLOAT_TO_INT(a->windowCoord.y); x1frac = __MCD_VERTEX_FLOAT_FRACTION(b->windowCoord.x); y1frac = __MCD_VERTEX_FLOAT_FRACTION(b->windowCoord.y); ix1 = __MCD_VERTEX_FLOAT_TO_INT(b->windowCoord.x); iy1 = __MCD_VERTEX_FLOAT_TO_INT(b->windowCoord.y); absIdx = idx = ix1 - ix0; if (absIdx < 0) absIdx = -absIdx; absIdy = idy = iy1 - iy0; if (absIdy < 0) absIdy = -absIdy; if (absIdx > absIdy) { signs = sdydxl_MAJOR_X; if (idx > 0) { signs |= sdxl_ADD; if (pRc->privateEnables & __MCDENABLE_Z) { __MCD_FLOAT_BEGIN_DIVIDE(__MCDONE, b->windowCoord.x - a->windowCoord.x, &invLength); } y0frac -= __MCD_VERTEX_FRAC_HALF; if (y0frac < 0) y0frac = -y0frac; totDist = y0frac + x0frac - __MCD_VERTEX_FRAC_ONE; if (totDist > 0) { ix0++; adjust++; } y1frac -= __MCD_VERTEX_FRAC_HALF; if (y1frac < 0) y1frac = -y1frac; totDist = y1frac + x1frac - __MCD_VERTEX_FRAC_ONE; if (totDist > 0) ix1++; numPixels = ix1 - ix0; } else { signs |= sdxl_SUB; if (pRc->privateEnables & __MCDENABLE_Z) { __MCD_FLOAT_BEGIN_DIVIDE(__MCDONE, a->windowCoord.x - b->windowCoord.x, &invLength); } y0frac -= __MCD_VERTEX_FRAC_HALF; if (y0frac < 0) y0frac = -y0frac; totDist = y0frac - x0frac; if (totDist > 0) { ix0--; adjust++; } y1frac -= __MCD_VERTEX_FRAC_HALF; if (y1frac < 0) y1frac = -y1frac; totDist = y1frac - x1frac; if (totDist > 0) ix1--; numPixels = ix0 - ix1; } if (numPixels <= 0) { if (pRc->privateEnables & __MCDENABLE_Z) __MCD_FLOAT_SIMPLE_END_DIVIDE(invLength); return; } majorInc = (absIdy << 1); minorInc = ((LONG)absIdy - (LONG)absIdx) << 1; if (idy < 0) { signs |= sdy_SUB; err = majorInc - (LONG)absIdx - 1; if (adjust) { if (err <= 0) err += majorInc; else { iy0--; err += minorInc; } } } else { signs |= sdy_ADD; err = majorInc - (LONG)absIdx; if (adjust) { if (err <= 0) err += majorInc; else { iy0++; err += minorInc; } } } } else { signs = sdydxl_MAJOR_Y; if (idy > 0) { signs |= sdy_ADD; if (pRc->privateEnables & __MCDENABLE_Z) { __MCD_FLOAT_BEGIN_DIVIDE(__MCDONE, b->windowCoord.y - a->windowCoord.y, &invLength); } x0frac -= __MCD_VERTEX_FRAC_HALF; if (x0frac < 0) x0frac = -x0frac; totDist = y0frac + x0frac - __MCD_VERTEX_FRAC_ONE; if (totDist > 0) { iy0++; adjust++; } x1frac -= __MCD_VERTEX_FRAC_HALF; if (x1frac < 0) x1frac = -x1frac; totDist = y1frac + x1frac - __MCD_VERTEX_FRAC_ONE; if (totDist > 0) iy1++; numPixels = iy1 - iy0; } else { signs |= sdy_SUB; if (pRc->privateEnables & __MCDENABLE_Z) { __MCD_FLOAT_BEGIN_DIVIDE(__MCDONE, a->windowCoord.y - b->windowCoord.y, &invLength); } x0frac -= __MCD_VERTEX_FRAC_HALF; if (x0frac < 0) x0frac = -x0frac; totDist = x0frac - y0frac; if (totDist > 0) { iy0--; adjust++; } x1frac -= __MCD_VERTEX_FRAC_HALF; if (x1frac < 0) x1frac = -x1frac; totDist = x1frac - y1frac; if (totDist > 0) iy1--; numPixels = iy0 - iy1; } if (numPixels <= 0) { if (pRc->privateEnables & __MCDENABLE_Z) __MCD_FLOAT_SIMPLE_END_DIVIDE(invLength); return; } majorInc = (absIdx << 1); minorInc = ((LONG)absIdx - (LONG)absIdy) << 1; if (idx < 0) { signs |= sdxl_SUB; err = majorInc - (LONG)absIdy - 1; if (adjust) { if (err <= 0) err += majorInc; else { ix0--; err += minorInc; } } } else { signs |= sdxl_ADD; err = majorInc - (LONG)absIdy; if (adjust) { if (err <= 0) err += majorInc; else { ix0++; err += minorInc; } } } } if (pRc->privateEnables & __MCDENABLE_Z) { CHECK_FIFO_FREE(pjBase, pRc->cFifo, 3+3+6); #if _X86_ && ASM_ACCEL _asm{ mov ebx, b mov eax, a fld DWORD PTR [OFFSET(MCDVERTEX.windowCoord.z)][ebx] fsub DWORD PTR [OFFSET(MCDVERTEX.windowCoord.z)][eax] // dz len mov ebx, pRc fld DWORD PTR [OFFSET(MCDVERTEX.windowCoord.z)][eax] // a.z dz len fxch ST(2) // len dz a.z fmulp ST(1), ST //+1 // dzL a.z fxch ST(1) // a.z dzL fmul DWORD PTR [OFFSET(DEVRC.zScale)][ebx] // azS dzL fxch ST(1) // dzL azS fmul DWORD PTR [OFFSET(DEVRC.zScale)][ebx] //+1 // dzLS azS fxch ST(1) // azS dzLS fistp iZStart fistp idz } #else __MCD_FLOAT_SIMPLE_END_DIVIDE(invLength); idz.LowPart = FTOL((b->windowCoord.z - a->windowCoord.z) * invLength * pRc->zScale); iZStart.LowPart = FTOL(a->windowCoord.z * pRc->zScale); #endif CP_WRITE(pjBase, DWG_DR2, idz.LowPart); CP_WRITE(pjBase, DWG_DR3, idz.LowPart); CP_WRITE(pjBase, DWG_DR0, iZStart.LowPart); } else { CHECK_FIFO_FREE(pjBase, pRc->cFifo, 3+6); } CP_WRITE(pjBase, DWG_AR0, majorInc); CP_WRITE(pjBase, DWG_AR1, err); CP_WRITE(pjBase, DWG_AR2, minorInc); CP_WRITE(pjBase, DWG_SGN, signs); CP_WRITE(pjBase, DWG_XDST, (ix0 + pRc->xOffset) & 0xffff); CP_WRITE(pjBase, DWG_YDSTLEN, ((iy0 + pRc->yOffset) << 16) | numPixels); #if _X86_ && ASM_ACCEL { LONG rTemp, gTemp, bTemp; _asm{ mov eax, a mov ebx, pRc lea eax, [OFFSET(MCDVERTEX.colors) + eax] fld DWORD PTR [OFFSET(DEVRC.rScale)][ebx] fmul DWORD PTR [OFFSET(MCDCOLOR.r)][eax] fld DWORD PTR [OFFSET(DEVRC.gScale)][ebx] fmul DWORD PTR [OFFSET(MCDCOLOR.g)][eax] fld DWORD PTR [OFFSET(DEVRC.bScale)][ebx] // B G R fmul DWORD PTR [OFFSET(MCDCOLOR.b)][eax] fxch ST(2) // R G B fistp rTemp // G B fistp gTemp fistp bTemp } CP_WRITE(pjBase, DWG_DR4, rTemp); CP_WRITE(pjBase, DWG_DR8, gTemp); CP_START(pjBase, DWG_DR12, bTemp); } #else ac = &a->colors[0]; CP_WRITE(pjBase, DWG_DR4, FTOL(ac->r * pRc->rScale)); CP_WRITE(pjBase, DWG_DR8, FTOL(ac->g * pRc->gScale)); CP_START(pjBase, DWG_DR12, FTOL(ac->b * pRc->bScale)); #endif while (--clipNum) { (*pRc->HWSetupClipRect)(pRc, pClip++); CHECK_FIFO_FREE(pjBase, pRc->cFifo, 4); CP_WRITE(pjBase, DWG_DR0, iZStart.LowPart); CP_WRITE(pjBase, DWG_AR1, err); CP_WRITE(pjBase, DWG_XDST, (ix0 + pRc->xOffset) & 0xffff); CP_START(pjBase, DWG_YDSTLEN, ((iy0 + pRc->yOffset) << 16) | numPixels); } } VOID FASTCALL __MCDRenderSmoothLine(DEVRC *pRc, MCDVERTEX *a, MCDVERTEX *b, BOOL resetLine) { PDEV *ppdev = pRc->ppdev; BYTE *pjBase = ppdev->pjBase; ULONG clipNum; RECTL *pClip; MCDFLOAT dr, dg, db; ULONG idr, idg, idb; LONG iRStart, iGStart, iBStart; MCDFLOAT length, invLength; MCDCOLOR *ac, *bc; LONG ix0, ix1, iy0, iy1; LONG idx, idy; LONG absIdx, absIdy; LONG x0frac, x1frac, y0frac, y1frac, totDist; LONG numPixels; LARGE_INTEGER idz, iZStart; LONG err; ULONG signs; ULONG adjust = 0; LONG majorInc; LONG minorInc; if ((clipNum = pRc->pEnumClip->c) > 1) { pClip = &pRc->pEnumClip->arcl[0]; (*pRc->HWSetupClipRect)(pRc, pClip++); } x0frac = __MCD_VERTEX_FLOAT_FRACTION(a->windowCoord.x); y0frac = __MCD_VERTEX_FLOAT_FRACTION(a->windowCoord.y); ix0 = __MCD_VERTEX_FLOAT_TO_INT(a->windowCoord.x); iy0 = __MCD_VERTEX_FLOAT_TO_INT(a->windowCoord.y); x1frac = __MCD_VERTEX_FLOAT_FRACTION(b->windowCoord.x); y1frac = __MCD_VERTEX_FLOAT_FRACTION(b->windowCoord.y); ix1 = __MCD_VERTEX_FLOAT_TO_INT(b->windowCoord.x); iy1 = __MCD_VERTEX_FLOAT_TO_INT(b->windowCoord.y); absIdx = idx = ix1 - ix0; if (absIdx < 0) absIdx = -absIdx; absIdy = idy = iy1 - iy0; if (absIdy < 0) absIdy = -absIdy; if (absIdx > absIdy) { signs = sdydxl_MAJOR_X; if (idx > 0) { signs |= sdxl_ADD; __MCD_FLOAT_BEGIN_DIVIDE(__MCDONE, b->windowCoord.x - a->windowCoord.x, &invLength); y0frac -= __MCD_VERTEX_FRAC_HALF; if (y0frac < 0) y0frac = -y0frac; totDist = y0frac + x0frac - __MCD_VERTEX_FRAC_ONE; if (totDist > 0) { ix0++; adjust++; } y1frac -= __MCD_VERTEX_FRAC_HALF; if (y1frac < 0) y1frac = -y1frac; totDist = y1frac + x1frac - __MCD_VERTEX_FRAC_ONE; if (totDist > 0) ix1++; numPixels = ix1 - ix0; } else { signs |= sdxl_SUB; __MCD_FLOAT_BEGIN_DIVIDE(__MCDONE, a->windowCoord.x - b->windowCoord.x, &invLength); y0frac -= __MCD_VERTEX_FRAC_HALF; if (y0frac < 0) y0frac = -y0frac; totDist = y0frac - x0frac; if (totDist > 0) { ix0--; adjust++; } y1frac -= __MCD_VERTEX_FRAC_HALF; if (y1frac < 0) y1frac = -y1frac; totDist = y1frac - x1frac; if (totDist > 0) ix1--; numPixels = ix0 - ix1; } if (numPixels <= 0) { __MCD_FLOAT_SIMPLE_END_DIVIDE(invLength); return; } if (numPixels == 1) goto shortLine; majorInc = (absIdy << 1); minorInc = ((LONG)absIdy - (LONG)absIdx) << 1; if (idy < 0) { signs |= sdy_SUB; err = majorInc - (LONG)absIdx - 1; if (adjust) { if (err <= 0) err += majorInc; else { iy0--; err += minorInc; } } } else { signs |= sdy_ADD; err = majorInc - (LONG)absIdx; if (adjust) { if (err <= 0) err += majorInc; else { iy0++; err += minorInc; } } } } else { signs = sdydxl_MAJOR_Y; if (idy > 0) { signs |= sdy_ADD; __MCD_FLOAT_BEGIN_DIVIDE(__MCDONE, b->windowCoord.y - a->windowCoord.y, &invLength); x0frac -= __MCD_VERTEX_FRAC_HALF; if (x0frac < 0) x0frac = -x0frac; totDist = y0frac + x0frac - __MCD_VERTEX_FRAC_ONE; if (totDist > 0) { iy0++; adjust++; } x1frac -= __MCD_VERTEX_FRAC_HALF; if (x1frac < 0) x1frac = -x1frac; totDist = y1frac + x1frac - __MCD_VERTEX_FRAC_ONE; if (totDist > 0) iy1++; numPixels = iy1 - iy0; } else { signs |= sdy_SUB; __MCD_FLOAT_BEGIN_DIVIDE(__MCDONE, a->windowCoord.y - b->windowCoord.y, &invLength); x0frac -= __MCD_VERTEX_FRAC_HALF; if (x0frac < 0) x0frac = -x0frac; totDist = x0frac - y0frac; if (totDist > 0) { iy0--; adjust++; } x1frac -= __MCD_VERTEX_FRAC_HALF; if (x1frac < 0) x1frac = -x1frac; totDist = x1frac - y1frac; if (totDist > 0) iy1--; numPixels = iy0 - iy1; } if (numPixels <= 0) { __MCD_FLOAT_SIMPLE_END_DIVIDE(invLength); return; } if (numPixels == 1) goto shortLine; majorInc = (absIdx << 1); minorInc = ((LONG)absIdx - (LONG)absIdy) << 1; if (idx < 0) { signs |= sdxl_SUB; err = majorInc - (LONG)absIdy - 1; if (adjust) { if (err <= 0) err += majorInc; else { ix0--; err += minorInc; } } } else { signs |= sdxl_ADD; err = majorInc - (LONG)absIdy; if (adjust) { if (err <= 0) err += majorInc; else { ix0++; err += minorInc; } } } } __MCD_FLOAT_SIMPLE_END_DIVIDE(invLength); if (pRc->privateEnables & __MCDENABLE_Z) { CHECK_FIFO_FREE(pjBase, pRc->cFifo, 18); #if _X86_ && ASM_ACCEL _asm{ mov ebx, b mov eax, a fld DWORD PTR [OFFSET(MCDVERTEX.windowCoord.z)][ebx] fsub DWORD PTR [OFFSET(MCDVERTEX.windowCoord.z)][eax] // dz mov ebx, pRc fld DWORD PTR [OFFSET(MCDVERTEX.windowCoord.z)][eax] // a.z dz fxch ST(1) // dz a.z fmul invLength //+1 // dzL fxch ST(1) // a.z dzL fmul DWORD PTR [OFFSET(DEVRC.zScale)][ebx] // azS dzL fxch ST(1) // dzL azS fmul DWORD PTR [OFFSET(DEVRC.zScale)][ebx] //+1 // dzLS azS fxch ST(1) // azS dzLS fistp iZStart fistp idz } #else idz.LowPart = FTOL((b->windowCoord.z - a->windowCoord.z) * invLength * pRc->zScale); iZStart.LowPart = FTOL(a->windowCoord.z * pRc->zScale); #endif CP_WRITE(pjBase, DWG_DR2, idz.LowPart); CP_WRITE(pjBase, DWG_DR3, idz.LowPart); CP_WRITE(pjBase, DWG_DR0, iZStart.LowPart); } else { CHECK_FIFO_FREE(pjBase, pRc->cFifo, 15); } CP_WRITE(pjBase, DWG_AR0, majorInc); CP_WRITE(pjBase, DWG_AR1, err); CP_WRITE(pjBase, DWG_AR2, minorInc); CP_WRITE(pjBase, DWG_SGN, signs); CP_WRITE(pjBase, DWG_XDST, (ix0 + pRc->xOffset) & 0xffff); CP_WRITE(pjBase, DWG_YDSTLEN, ((iy0 + pRc->yOffset) << 16) | numPixels); #if _X86_ && ASM_ACCEL _asm{ mov ebx, b mov eax, a mov edx, pRc lea ebx, [OFFSET(MCDVERTEX.colors) + ebx] lea eax, [OFFSET(MCDVERTEX.colors) + eax] fld DWORD PTR [OFFSET(MCDCOLOR.r)][ebx] fsub DWORD PTR [OFFSET(MCDCOLOR.r)][eax] // dr fld DWORD PTR [OFFSET(MCDCOLOR.g)][ebx] fsub DWORD PTR [OFFSET(MCDCOLOR.g)][eax] // dg dr fxch ST(1) // dr dg fmul invLength // drL dg fld DWORD PTR [OFFSET(MCDCOLOR.b)][ebx] fsub DWORD PTR [OFFSET(MCDCOLOR.b)][eax] // db drL dg fxch ST(2) // dg drL db fmul invLength // dgL drL db fxch ST(1) // drL dgL db fmul DWORD PTR [OFFSET(DEVRC.rScale)][edx] // drLS dgL db fxch ST(2) // db dgL drLS fmul invLength // dbL dgL drLS fxch ST(1) // dgL dbL drLS fmul DWORD PTR [OFFSET(DEVRC.gScale)][edx] // dgLS dbL drLS fxch ST(1) // dbL dgLS drLS fld DWORD PTR [OFFSET(MCDCOLOR.r)][eax] fmul DWORD PTR [OFFSET(DEVRC.rScale)][edx] // r dbL dgLS drLS fxch ST(1) // dbL r dgLS drLS fmul DWORD PTR [OFFSET(DEVRC.bScale)][edx] // dbLS r dgLS drLS fxch ST(1) // r dbLS dgLS drLS fld DWORD PTR [OFFSET(MCDCOLOR.g)][eax] fmul DWORD PTR [OFFSET(DEVRC.gScale)][edx] // g r dbLS dgLS drLS fld DWORD PTR [OFFSET(MCDCOLOR.b)][eax] fmul DWORD PTR [OFFSET(DEVRC.bScale)][edx] // b g r dbLS dgLS drLS fxch ST(2) // r g b dbLS dgLS drLS fistp iRStart fistp iGStart fistp iBStart fistp idb fistp idg fistp idr } #else ac = &a->colors[0]; bc = &b->colors[0]; dr = (bc->r - ac->r) * invLength * pRc->rScale; dg = (bc->g - ac->g) * invLength * pRc->gScale; db = (bc->b - ac->b) * invLength * pRc->bScale; iRStart = FTOL(ac->r * pRc->rScale); iGStart = FTOL(ac->g * pRc->gScale); iBStart = FTOL(ac->b * pRc->bScale); idr = FTOL(dr); idg = FTOL(dg); idb = FTOL(db); #endif CP_WRITE(pjBase, DWG_DR6, idr); CP_WRITE(pjBase, DWG_DR7, idr); CP_WRITE(pjBase, DWG_DR10, idg); CP_WRITE(pjBase, DWG_DR11, idg); CP_WRITE(pjBase, DWG_DR14, idb); CP_WRITE(pjBase, DWG_DR15, idb); CP_WRITE(pjBase, DWG_DR4, iRStart); CP_WRITE(pjBase, DWG_DR8, iGStart); CP_START(pjBase, DWG_DR12, iBStart); clipLine: while (--clipNum) { (*pRc->HWSetupClipRect)(pRc, pClip++); CHECK_FIFO_FREE(pjBase, pRc->cFifo, 7); CP_WRITE(pjBase, DWG_DR4, iRStart); CP_WRITE(pjBase, DWG_DR8, iGStart); CP_WRITE(pjBase, DWG_DR12, iBStart); CP_WRITE(pjBase, DWG_DR0, iZStart.LowPart); CP_WRITE(pjBase, DWG_AR1, err); CP_WRITE(pjBase, DWG_XDST, (ix0 + pRc->xOffset) & 0xffff); CP_START(pjBase, DWG_YDSTLEN, ((iy0 + pRc->yOffset) << 16) | numPixels); } return; shortLine: __MCD_FLOAT_SIMPLE_END_DIVIDE(invLength); // all we will be drawing is a single pixel, so don't bother with // the color or z interpolants: if (pRc->privateEnables & __MCDENABLE_Z) { #if _X86_ && ASM_ACCEL _asm { mov ecx, a mov edx, pRc lea eax, [OFFSET(MCDVERTEX.colors) + ecx] fld DWORD PTR [OFFSET(DEVRC.rScale)][edx] fmul DWORD PTR [OFFSET(MCDCOLOR.r)][eax] fld DWORD PTR [OFFSET(DEVRC.gScale)][edx] fmul DWORD PTR [OFFSET(MCDCOLOR.g)][eax] fld DWORD PTR [OFFSET(DEVRC.bScale)][edx] fmul DWORD PTR [OFFSET(MCDCOLOR.b)][eax] fld DWORD PTR [OFFSET(MCDVERTEX.windowCoord.z)][ecx] fmul DWORD PTR [OFFSET(DEVRC.zScale)][edx] // z b g r fxch ST(3) // r b g z fistp iRStart fistp iBStart fistp iGStart fistp iZStart } #else ac = &a->colors[0]; iRStart = FTOL(ac->r * pRc->rScale); iGStart = FTOL(ac->g * pRc->gScale); iBStart = FTOL(ac->b * pRc->bScale); iZStart.LowPart = FTOL(a->windowCoord.z * pRc->zScale); #endif CHECK_FIFO_FREE(pjBase, pRc->cFifo, 6); CP_WRITE(pjBase, DWG_DR0, iZStart.LowPart); } else { #if _X86_ && ASM_ACCEL _asm{ mov eax, a mov edx, pRc lea eax, [OFFSET(MCDVERTEX.colors) + eax] fld DWORD PTr [OFFSET(DEVRC.rScale)][edx] fmul DWORD PTR [OFFSET(MCDCOLOR.r)][eax] fld DWORD PTr [OFFSET(DEVRC.gScale)][edx] fmul DWORD PTR [OFFSET(MCDCOLOR.g)][eax] fld DWORD PTr [OFFSET(DEVRC.bScale)][edx] // b g r fmul DWORD PTR [OFFSET(MCDCOLOR.b)][eax] fxch ST(2) // r g b fistp iRStart fistp iGStart fistp iBStart } #else ac = &a->colors[0]; iRStart = FTOL(ac->r * pRc->rScale); iGStart = FTOL(ac->g * pRc->gScale); iBStart = FTOL(ac->b * pRc->bScale); #endif CHECK_FIFO_FREE(pjBase, pRc->cFifo, 5); } CP_WRITE(pjBase, DWG_XDST, (ix0 + pRc->xOffset) & 0xffff); CP_START(pjBase, DWG_YDSTLEN, ((iy0 + pRc->yOffset) << 16) + 1); CP_WRITE(pjBase, DWG_DR4, iRStart); CP_WRITE(pjBase, DWG_DR8, iGStart); CP_START(pjBase, DWG_DR12, iBStart); if (clipNum) goto clipLine; } VOID FASTCALL __MCDRenderGenLine(DEVRC *pRc, MCDVERTEX *pv1, MCDVERTEX *pv2, BOOL resetLine) { MCDBG_PRINT("__MCDRenderGenLine"); } VOID FASTCALL __MCDRenderFlatFogLine(DEVRC *pRc, MCDVERTEX *pv1, MCDVERTEX *pv2, BOOL resetLine) { MCDCOLOR c1, c2; c1 = pv1->colors[0]; c2 = pv2->colors[0]; __MCDCalcFogColor(pRc, pv1, &pv1->colors[0], &c1); __MCDCalcFogColor(pRc, pv2, &pv2->colors[0], &c2); (*pRc->renderLineX)(pRc, pv1, pv2, resetLine); pv1->colors[0] = c1; pv2->colors[0] = c2; } VOID FASTCALL __MCDLineBegin(DEVRC *pRc) { BYTE *pjBase = ((PDEV *)pRc->ppdev)->pjBase; CHECK_FIFO_FREE(pjBase, pRc->cFifo, 1); CP_WRITE(pjBase, DWG_DWGCTL, pRc->hwLineFunc); } VOID FASTCALL __MCDLineEnd(DEVRC *pRc) { }