Пример #1
0
	void Rasterizer::_EvaluateLine(CPoint p0, CPoint p1)
	{
		if(lastp != p0)
		{
			_EvaluateLine(lastp, p0);
		}

		if(!fFirstSet)
		{
			firstp = p0; 
			fFirstSet = true;
		}

		lastp = p1;

		// TODO: ((1<<FONT_SCALE)/2+-1)  

		if(p1.y > p0.y)	// down
		{
			int xacc = p0.x << (8 - FONT_SCALE);

			// prestep p0.y down

			int dy = p1.y - p0.y;
			int y = ((p0.y + ((1<<FONT_SCALE)/2-1)) & ~((1<<FONT_SCALE)-1)) + (1<<FONT_SCALE)/2;
			int iy = y >> FONT_SCALE;

			p1.y = (p1.y - ((1<<FONT_SCALE)/2+1)) >> FONT_SCALE;

			if(iy <= p1.y)
			{
				int invslope = ((p1.x - p0.x) << 8) / dy;

				while(mEdgeNext + p1.y + 1 - iy > mEdgeHeapSize)
					_ReallocEdgeBuffer(mEdgeHeapSize*2);

				xacc += (invslope * (y - p0.y)) >> FONT_SCALE;

				while(iy <= p1.y)
				{
					int ix = (xacc + 128) >> 8;

					mpEdgeBuffer[mEdgeNext].next = mpScanBuffer[iy];
					mpEdgeBuffer[mEdgeNext].posandflag = ix*2 + 1;

					mpScanBuffer[iy] = mEdgeNext++;

					++iy;
					xacc += invslope;
				}
			}
Пример #2
0
void Rasterizer::_EvaluateLine(int x0, int y0, int x1, int y1)
{
    if (lastp.x != x0 || lastp.y != y0) {
        _EvaluateLine(lastp.x, lastp.y, x0, y0);
    }

    if (!fFirstSet) {
        firstp.x = x0;
        firstp.y = y0;
        fFirstSet = true;
    }
    lastp.x = x1;
    lastp.y = y1;

    if (y1 > y0) {  // down
        __int64 xacc = (__int64)x0 << 13;

        // prestep y0 down

        int dy = y1 - y0;
        int y = ((y0 + 3) & ~7) + 4;
        int iy = y >> 3;

        y1 = (y1 - 5) >> 3;

        if (iy <= y1) {
            __int64 invslope = (__int64(x1 - x0) << 16) / dy;

            while (mEdgeNext + y1 + 1 - iy > mEdgeHeapSize) {
                _ReallocEdgeBuffer(mEdgeHeapSize * 2);
            }

            xacc += (invslope * (y - y0)) >> 3;

            while (iy <= y1) {
                int ix = (int)((xacc + 32768) >> 16);

                mpEdgeBuffer[mEdgeNext].next = mpScanBuffer[iy];
                mpEdgeBuffer[mEdgeNext].posandflag = ix * 2 + 1;

                mpScanBuffer[iy] = mEdgeNext++;

                ++iy;
                xacc += invslope;
            }
        }