public override void Line0(LineParameters lp) { if (doClipping) { int x1 = lp.x1; int y1 = lp.y1; int x2 = lp.x2; int y2 = lp.y2; int flags = ClipLiangBarsky.ClipLineSegment(ref x1, ref y1, ref x2, ref y2, clippingRectangle); if ((flags & 4) == 0) { if (flags != 0) { LineParameters lp2 = new LineParameters(x1, y1, x2, y2, AggBasics.uround(AggMath.calc_distance(x1, y1, x2, y2))); Line0NoClip(lp2); } else { Line0NoClip(lp); } } } else { Line0NoClip(lp); } }
public void PineHLine(int xc, int yc, int xp1, int yp1, int xp2, int yp2, int xh1, int yh1, int xh2) { if (doClipping && ClipLiangBarsky.Flags(xc, yc, clippingRectangle) != 0) { return; } byte[] covers = new byte[MAX_HALF_WIDTH * 2 + 4]; int index0 = 0; int index1 = 0; int x = xh1 << LineAA.SUBPIXEL_SHIFT; int y = yh1 << LineAA.SUBPIXEL_SHIFT; int w = SubPixelWidth; DistanceInterpolator00 di = new DistanceInterpolator00(xc, yc, xp1, yp1, xp2, yp2, x, y); x += LineAA.SUBPIXEL_SCALE / 2; y += LineAA.SUBPIXEL_SCALE / 2; int xh0 = xh1; int dx = x - xc; int dy = y - yc; do { int d = (int)(AggMath.fast_sqrt(dx * dx + dy * dy)); covers[index1] = 0; if (di.Distance1 <= 0 && di.Distance2 > 0 && d <= w) { covers[index1] = (byte)GetCover(d); } ++index1; dx += LineAA.SUBPIXEL_SCALE; di.IncX(); }while (++xh1 <= xh2); destImageSurface.BlendSolidHSpan(xh0, yh1, index1 - index0, Color, covers, index0); }
public override void SemiDot(CompareFunction cmp, int xc1, int yc1, int xc2, int yc2) { if (doClipping && ClipLiangBarsky.Flags(xc1, yc1, clippingRectangle) != 0) { return; } int r = ((SubPixelWidth + LineAA.SUBPIXEL_MARK) >> LineAA.SUBPIXEL_SHIFT); if (r < 1) { r = 1; } EllipseBresenhamInterpolator ei = new EllipseBresenhamInterpolator(r, r); int dx = 0; int dy = -r; int dy0 = dy; int dx0 = dx; int x = xc1 >> LineAA.SUBPIXEL_SHIFT; int y = yc1 >> LineAA.SUBPIXEL_SHIFT; do { dx += ei.Dx; dy += ei.Dy; if (dy != dy0) { SemiDotHLine(cmp, xc1, yc1, xc2, yc2, x - dx0, y + dy0, x + dx0); SemiDotHLine(cmp, xc1, yc1, xc2, yc2, x - dx0, y - dy0, x + dx0); } dx0 = dx; dy0 = dy; ei.Next(); }while (dy < 0); SemiDotHLine(cmp, xc1, yc1, xc2, yc2, x - dx0, y + dy0, x + dx0); }
public void MoveTo(int x1, int y1) { m_x1 = x1; m_y1 = y1; if (m_clipping) { m_f1 = ClipLiangBarsky.Flags(x1, y1, clipBox); } }
public override void Line3(LineParameters lp, int sx, int sy, int ex, int ey) { if (doClipping) { int x1 = lp.x1; int y1 = lp.y1; int x2 = lp.x2; int y2 = lp.y2; int flags = ClipLiangBarsky.ClipLineSegment(ref x1, ref y1, ref x2, ref y2, clippingRectangle); if ((flags & 4) == 0) { if (flags != 0) { LineParameters lp2 = new LineParameters(x1, y1, x2, y2, AggBasics.uround(AggMath.calc_distance(x1, y1, x2, y2))); if ((flags & 1) != 0) { sx = x1 + (y2 - y1); sy = y1 - (x2 - x1); } else { while (Math.Abs(sx - lp.x1) + Math.Abs(sy - lp.y1) > lp2.len) { sx = (lp.x1 + sx) >> 1; sy = (lp.y1 + sy) >> 1; } } if ((flags & 2) != 0) { ex = x2 + (y2 - y1); ey = y2 - (x2 - x1); } else { while (Math.Abs(ex - lp.x2) + Math.Abs(ey - lp.y2) > lp2.len) { ex = (lp.x2 + ex) >> 1; ey = (lp.y2 + ey) >> 1; } } Line3NoClip(lp2, sx, sy, ex, ey); } else { Line3NoClip(lp, sx, sy, ex, ey); } } } else { Line3NoClip(lp, sx, sy, ex, ey); } }
//-------------------------------------------------------------------- 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; }