Mình viết cái này bằng cách dùng pixel array (DWORD* m_pBits)! Tuy vẩn không thể bằng Bresenham nhưng nếu các bạn viết theo thuật toán Bresenham mà không có cách để tối ưu về tốc độ thì không thể nhanh bằng cách của mình đâu (Mình dùng cái này vẻ 1000 đường thẳng bất kì trong CRect(0,0,300,200) chỉ mất khoảng 0.018 s thôi!

Nếu các bạn muốn so sánh với Bresenham thì phải viết ra toàn bộ thuật toán bresenham trước nha, vì theo đa số các sách về đồ họa thì chỉ có đoạn mã để vẽ bresenham trong khoảng 0 -> -45 độ mà thôi (còn cách của mình thì vẻ từ 0 -> 360, nếu Bresenham chỉ vẻ có 0 -> 45 mà đem so sánh thì không công bằng chút nào)!

Code:
	BOOL RlLine(int x1,int y1,int x2,int y2,DWORD Color = 0,BYTE Transparency = 255)
	{
		// Using Rlline algorithm
		if(!m_pBits) return 0;
		if(GetValidLine(x1,y1,x2,y2) <= 0) return -1;	// Get two rear points of line which inside drawing area
		if(y1 > y2)
		{
			Swap(x1,x2);
			Swap(y1,y2);
		}
		int dx = abs(x1 - x2);
		int dy = y2 - y1;
		SetPixel(x2,y2,Color,Transparency);	// Set last pixel
		if(x1 == x2)	// Vertical line
		{
			DWORD* pLine = &m_pBits[x1 + m_Width*y1];
			if(Transparency == 255)
			{
				for(int i = 0;i < dy;i++)
				{
					*pLine = Color;
					pLine += m_Width;
				}
			}
			else
			{
				for(int i = 0;i < dy;i++)
				{
					*pLine = AlphaBlend(*pLine,Color,Transparency);
					pLine += m_Width;
				}
			}
			return 1;
		}
		if(y1 == y2)	// Horizontal line
		{
			if(x1 > x2) Swap(x1,x2);
			DWORD* pLine = &m_pBits[x1 + m_Width*y1];
			if(Transparency == 255) for(int i = 0;i < dx;i++) *pLine++ = Color;
			else for(int i = 0;i < dx;i++) *pLine++ = AlphaBlend(*pLine,Color,Transparency);
			return 2;
		}
		if(dx == dy)	// Diagonal line
		{
			DWORD* pLine = &m_pBits[x1 + m_Width*y1];
			if(Transparency == 255)
			{
				for(int i = 0;i < dx;i++)
				{
					*pLine = Color;
					pLine += m_Width + ((x2 > x1) ? 1 : -1);
				}
			}
			else
			{
				for(int i = 0;i < dx;i++)
				{
					*pLine = AlphaBlend(*pLine,Color,Transparency);
					pLine += m_Width + ((x2 > x1) ? 1 : -1);
				}
			}
			return 3;
		}
		DWORD* Ptr = &m_pBits[y1*m_Width + x1];
		*Ptr = AlphaBlend(*Ptr,Color,Transparency);
		if(dx > dy)
		{
			int incl = dy;
			int incr = dx;
			if(Transparency == 255)
			{
				if(x1 < x2)
				{
					for(int i = 1;i <= dx;i++)
					{
						if(incl > incr)
						{
							Ptr += m_Width;
							incr += dx;
						}
						*Ptr++ = Color;
						incl += dy;
					}
				}
				else
				{
					for(int i = 1;i <= dx;i++)
					{
						if(incl > incr)
						{
							Ptr += m_Width;
							incr += dx;
						}
						*Ptr-- = Color;
						incl += dy;
					}
				}
			}
			else
			{
				if(x1 < x2)
				{
					for(int i = 1;i <= dx;i++)
					{
						if(incl > incr)
						{
							Ptr += m_Width;
							incr += dx;
						}
						*Ptr++ = AlphaBlend(*Ptr,Color,Transparency);
						incl += dy;
					}
				}
				else
				{
					for(int i = 1;i <= dx;i++)
					{
						if(incl > incr)
						{
							Ptr += m_Width;
							incr += dx;
						}
						*Ptr-- = AlphaBlend(*Ptr,Color,Transparency);;
						incl += dy;
					}
				}
			}
		}
		else
		{
			int incl = dx;
			int incr = dy;
			if(Transparency == 255)
			{
				if(x1 < x2)
				{
					for(int i = 1;i <= dy;i++)
					{
						if(incl > incr)
						{
							Ptr++;
							incr += dy;
						}
						*Ptr = AlphaBlend(*Ptr,Color,Transparency);
						Ptr += m_Width;
						incl += dx;
					}
				}
				else
				{
					for(int i = 1;i <= dy;i++)
					{
						if(incl > incr)
						{
							Ptr--;
							incr += dy;
						}
						*Ptr = AlphaBlend(*Ptr,Color,Transparency);
						Ptr += m_Width;
						incl += dx;
					}
				}
			}
			else
			{
				if(x1 < x2)
				{
					for(int i = 1;i <= dy;i++)
					{
						if(incl > incr)
						{
							Ptr++;
							incr += dy;
						}
						*Ptr = AlphaBlend(*Ptr,Color,Transparency);
						Ptr += m_Width;
						incl += dx;
					}
				}
				else
				{
					for(int i = 1;i <= dy;i++)
					{
						if(incl > incr)
						{
							Ptr--;
							incr += dy;
						}
						*Ptr = AlphaBlend(*Ptr,Color,Transparency);
						Ptr += m_Width;
						incl += dx;
					}
				}
			}
		}
		return 1;
	}