Beispiel #1
0
 //--------------------------------------------------------------------
 public void MoveTo(int x1, int y1)
 {
     m_x1 = x1;
     m_y1 = y1;
     if (m_clipping)
     {
         m_f1 = ClipLiangBarsky.GetClippingFlags(x1, y1, m_clip_box);
     }
 }
Beispiel #2
0
        //--------------------------------------------------------------------
        public void LineTo(AntiAliasedRasterizerCells ras, int x2, int y2)
        {
            if (m_clipping)
            {
                uint f2 = ClipLiangBarsky.GetClippingFlags(x2, y2, m_clip_box);

                if ((m_f1 & 10) == (f2 & 10) && (m_f1 & 10) != 0)
                {
                    // Invisible by Y
                    m_x1 = x2;
                    m_y1 = y2;
                    m_f1 = f2;
                    return;
                }

                int  x1 = m_x1;
                int  y1 = m_y1;
                uint f1 = m_f1;
                int  y3, y4;
                uint f3, f4;

                switch (((f1 & 5) << 1) | (f2 & 5))
                {
                case 0:                         // Visible by X
                    line_clip_y(ras, x1, y1, x2, y2, f1, f2);
                    break;

                case 1:                         // x2 > Clip.x2
                    y3 = y1 + MulDiv(m_clip_box.x2 - x1, y2 - y1, x2 - x1);
                    f3 = ClipLiangBarsky.ClippingFlagsY(y3, m_clip_box);
                    line_clip_y(ras, x1, y1, m_clip_box.x2, y3, f1, f3);
                    line_clip_y(ras, m_clip_box.x2, y3, m_clip_box.x2, y2, f3, f2);
                    break;

                case 2:                         // x1 > Clip.x2
                    y3 = y1 + MulDiv(m_clip_box.x2 - x1, y2 - y1, x2 - x1);
                    f3 = ClipLiangBarsky.ClippingFlagsY(y3, m_clip_box);
                    line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y3, f1, f3);
                    line_clip_y(ras, m_clip_box.x2, y3, x2, y2, f3, f2);
                    break;

                case 3:                         // x1 > Clip.x2 && x2 > Clip.x2
                    line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y2, f1, f2);
                    break;

                case 4:                         // x2 < Clip.x1
                    y3 = y1 + MulDiv(m_clip_box.x1 - x1, y2 - y1, x2 - x1);
                    f3 = ClipLiangBarsky.ClippingFlagsY(y3, m_clip_box);
                    line_clip_y(ras, x1, y1, m_clip_box.x1, y3, f1, f3);
                    line_clip_y(ras, m_clip_box.x1, y3, m_clip_box.x1, y2, f3, f2);
                    break;

                case 6:                         // x1 > Clip.x2 && x2 < Clip.x1
                    y3 = y1 + MulDiv(m_clip_box.x2 - x1, y2 - y1, x2 - x1);
                    y4 = y1 + MulDiv(m_clip_box.x1 - x1, y2 - y1, x2 - x1);
                    f3 = ClipLiangBarsky.ClippingFlagsY(y3, m_clip_box);
                    f4 = ClipLiangBarsky.ClippingFlagsY(y4, m_clip_box);
                    line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y3, f1, f3);
                    line_clip_y(ras, m_clip_box.x2, y3, m_clip_box.x1, y4, f3, f4);
                    line_clip_y(ras, m_clip_box.x1, y4, m_clip_box.x1, y2, f4, f2);
                    break;

                case 8:                         // x1 < Clip.x1
                    y3 = y1 + MulDiv(m_clip_box.x1 - x1, y2 - y1, x2 - x1);
                    f3 = ClipLiangBarsky.ClippingFlagsY(y3, m_clip_box);
                    line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y3, f1, f3);
                    line_clip_y(ras, m_clip_box.x1, y3, x2, y2, f3, f2);
                    break;

                case 9:                          // x1 < Clip.x1 && x2 > Clip.x2
                    y3 = y1 + MulDiv(m_clip_box.x1 - x1, y2 - y1, x2 - x1);
                    y4 = y1 + MulDiv(m_clip_box.x2 - x1, y2 - y1, x2 - x1);
                    f3 = ClipLiangBarsky.ClippingFlagsY(y3, m_clip_box);
                    f4 = ClipLiangBarsky.ClippingFlagsY(y4, m_clip_box);
                    line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y3, f1, f3);
                    line_clip_y(ras, m_clip_box.x1, y3, m_clip_box.x2, y4, f3, f4);
                    line_clip_y(ras, m_clip_box.x2, y4, m_clip_box.x2, y2, f4, f2);
                    break;

                case 12:                         // x1 < Clip.x1 && x2 < Clip.x1
                    line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y2, f1, f2);
                    break;
                }
                m_f1 = f2;
            }
            else
            {
                ras.Line(m_x1, m_y1,
                         x2, y2);
            }
            m_x1 = x2;
            m_y1 = y2;
        }