Exemplo n.º 1
0
 public void MoveTo(int x1, int y1)
 {
     m_x1 = x1;
     m_y1 = y1;
     if (m_clipping)
     {
         m_f1 = ClipLiangBarsky.Flags(x1, y1, clipBox);
     }
 }
Exemplo n.º 2
0
            //--------------------------------------------------------------------
            public void LineTo(int x2, int y2)
            {
                if (m_clipping)
                {
                    int f2 = ClipLiangBarsky.Flags(x2, y2, clipBox);

                    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;
                    int f1 = m_f1;
                    int y3, y4;
                    int f3, f4;

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

                    case 1:     // x2 > clip.x2
                        y3 = y1 + MulDiv(clipBox.Right - x1, y2 - y1, x2 - x1);
                        f3 = ClipLiangBarsky.GetFlagsY(y3, clipBox);
                        LineClipY(x1, y1, clipBox.Right, y3, f1, f3);
                        LineClipY(clipBox.Right, y3, clipBox.Right, y2, f3, f2);
                        break;

                    case 2:     // x1 > clip.x2
                        y3 = y1 + MulDiv(clipBox.Right - x1, y2 - y1, x2 - x1);
                        f3 = ClipLiangBarsky.GetFlagsY(y3, clipBox);
                        LineClipY(clipBox.Right, y1, clipBox.Right, y3, f1, f3);
                        LineClipY(clipBox.Right, y3, x2, y2, f3, f2);
                        break;

                    case 3:     // x1 > clip.x2 && x2 > clip.x2
                        LineClipY(clipBox.Right, y1, clipBox.Right, y2, f1, f2);
                        break;

                    case 4:     // x2 < clip.x1
                        y3 = y1 + MulDiv(clipBox.Left - x1, y2 - y1, x2 - x1);
                        f3 = ClipLiangBarsky.GetFlagsY(y3, clipBox);
                        LineClipY(x1, y1, clipBox.Left, y3, f1, f3);
                        LineClipY(clipBox.Left, y3, clipBox.Left, y2, f3, f2);
                        break;

                    case 6:     // x1 > clip.x2 && x2 < clip.x1
                        y3 = y1 + MulDiv(clipBox.Right - x1, y2 - y1, x2 - x1);
                        y4 = y1 + MulDiv(clipBox.Left - x1, y2 - y1, x2 - x1);
                        f3 = ClipLiangBarsky.GetFlagsY(y3, clipBox);
                        f4 = ClipLiangBarsky.GetFlagsY(y4, clipBox);
                        LineClipY(clipBox.Right, y1, clipBox.Right, y3, f1, f3);
                        LineClipY(clipBox.Right, y3, clipBox.Left, y4, f3, f4);
                        LineClipY(clipBox.Left, y4, clipBox.Left, y2, f4, f2);
                        break;

                    case 8:     // x1 < clip.x1
                        y3 = y1 + MulDiv(clipBox.Left - x1, y2 - y1, x2 - x1);
                        f3 = ClipLiangBarsky.GetFlagsY(y3, clipBox);
                        LineClipY(clipBox.Left, y1, clipBox.Left, y3, f1, f3);
                        LineClipY(clipBox.Left, y3, x2, y2, f3, f2);
                        break;

                    case 9:      // x1 < clip.x1 && x2 > clip.x2
                        y3 = y1 + MulDiv(clipBox.Left - x1, y2 - y1, x2 - x1);
                        y4 = y1 + MulDiv(clipBox.Right - x1, y2 - y1, x2 - x1);
                        f3 = ClipLiangBarsky.GetFlagsY(y3, clipBox);
                        f4 = ClipLiangBarsky.GetFlagsY(y4, clipBox);
                        LineClipY(clipBox.Left, y1, clipBox.Left, y3, f1, f3);
                        LineClipY(clipBox.Left, y3, clipBox.Right, y4, f3, f4);
                        LineClipY(clipBox.Right, y4, clipBox.Right, y2, f4, f2);
                        break;

                    case 12:     // x1 < clip.x1 && x2 < clip.x1
                        LineClipY(clipBox.Left, y1, clipBox.Left, y2, f1, f2);
                        break;
                    }
                    m_f1 = f2;
                }
                else
                {
                    ras.DrawLine(m_x1, m_y1,
                                 x2, y2);
                }
                m_x1 = x2;
                m_y1 = y2;
            }