internal void Draw(DrawingPathBackendHandler targetHandler, object ctx, VectorImageData cm) { int di = 0; int ci = 0; int ii = 0; int ri = 0; int oi = 0; int imi = 0; int ti = 0; ContextBackendHandler handler = targetHandler as ContextBackendHandler; DrawingPathBackendHandler pathHandler = targetHandler; for (int n = 0; n < cm.Commands.Length; n++) { switch (cm.Commands [n]) { case DrawingCommand.AppendPath: var p = cm.Objects [oi++]; if (p is VectorImageData) { Draw(targetHandler, ctx, (VectorImageData)p); } else { pathHandler.AppendPath(ctx, p); } break; case DrawingCommand.Arc: pathHandler.Arc(ctx, cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.ArcNegative: pathHandler.ArcNegative(ctx, cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.Clip: handler.Clip(ctx); break; case DrawingCommand.ClipPreserve: handler.ClipPreserve(ctx); break; case DrawingCommand.ClosePath: pathHandler.ClosePath(ctx); break; case DrawingCommand.CurveTo: pathHandler.CurveTo(ctx, cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.DrawImage2: handler.DrawImage(ctx, cm.Images [imi++], cm.Rectangles [ri++], cm.Rectangles [ri++]); break; case DrawingCommand.DrawImage: handler.DrawImage(ctx, cm.Images [imi++], cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.DrawTextLayout: var lad = (TextLayoutData)cm.TextLayouts [ti++]; var la = new TextLayout(toolkit); lad.InitLayout(la); handler.DrawTextLayout(ctx, la, cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.Fill: handler.Fill(ctx); break; case DrawingCommand.FillPreserve: handler.FillPreserve(ctx); break; case DrawingCommand.LineTo: pathHandler.LineTo(ctx, cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.MoveTo: pathHandler.MoveTo(ctx, cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.NewPath: handler.NewPath(ctx); break; case DrawingCommand.Rectangle: pathHandler.Rectangle(ctx, cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.RelCurveTo: pathHandler.RelCurveTo(ctx, cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.RelLineTo: pathHandler.RelLineTo(ctx, cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.RelMoveTo: pathHandler.RelMoveTo(ctx, cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.Restore: handler.Restore(ctx); break; case DrawingCommand.Rotate: handler.Rotate(ctx, cm.Doubles [di++]); break; case DrawingCommand.Save: handler.Save(ctx); break; case DrawingCommand.Scale: handler.Scale(ctx, cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.SetColor: handler.SetColor(ctx, cm.Colors [ci++]); break; case DrawingCommand.SetGlobalAlpha: handler.SetGlobalAlpha(ctx, cm.Doubles [di++]); break; case DrawingCommand.SetLineDash: var off = cm.Doubles [di++]; var ds = new double [cm.Ints [ii++]]; for (int i = 0; i < ds.Length; i++) { ds [i] = cm.Doubles [di++]; } handler.SetLineDash(ctx, off, ds); break; case DrawingCommand.SetLineWidth: handler.SetLineWidth(ctx, cm.Doubles [di++]); break; case DrawingCommand.SetPattern: handler.SetPattern(ctx, cm.Objects [oi++]); break; case DrawingCommand.Stroke: handler.Stroke(ctx); break; case DrawingCommand.StrokePreserve: handler.StrokePreserve(ctx); break; case DrawingCommand.Translate: handler.Translate(ctx, cm.Doubles [di++], cm.Doubles [di++]); break; case DrawingCommand.SetStyles: handler.SetStyles(ctx, (StyleSet)cm.Objects [oi++]); break; } } }
/// <summary> /// Relative-coordinate version of curve_to(). /// All offsets are relative to the current point. /// Adds a cubic Bezier spline to the path from the current point to a point offset /// from the current point by (dx3, dy3), using points offset by (dx1, dy1) and (dx2, dy2) /// as the control points. After this call the current point will be offset by (dx3, dy3). /// Given a current point of (x, y), RelCurveTo(dx1, dy1, dx2, dy2, dx3, dy3) /// is logically equivalent to CurveTo(x + dx1, y + dy1, x + dx2, y + dy2, x + dx3, y + dy3). /// </summary> /// <param name='dx1'> /// Dx1. /// </param> /// <param name='dy1'> /// Dy1. /// </param> /// <param name='dx2'> /// Dx2. /// </param> /// <param name='dy2'> /// Dy2. /// </param> /// <param name='dx3'> /// Dx3. /// </param> /// <param name='dy3'> /// Dy3. /// </param> public void RelCurveTo(double dx1, double dy1, double dx2, double dy2, double dx3, double dy3) { handler.RelCurveTo(Backend, dx1, dy1, dx2, dy2, dx3, dy3); }