public int Restore(InternalGraphicsState state) { if (!_stack.Contains(state)) { throw new ArgumentException("State not on stack.", "state"); } if (state.Invalid) { throw new ArgumentException("State already restored.", "state"); } int count = 1; InternalGraphicsState top = _stack.Pop(); top.Popped(); while (top != state) { count++; state.Invalid = true; top = _stack.Pop(); top.Popped(); } state.Invalid = true; return(count); }
public int Restore(InternalGraphicsState state) { if (!this.stack.Contains(state)) throw new ArgumentException("State not on stack.", "state"); if (state.invalid) throw new ArgumentException("State already restored.", "state"); int count = 1; InternalGraphicsState top = (InternalGraphicsState)this.stack.Pop(); while (top != state) { count++; state.invalid = true; top = (InternalGraphicsState)this.stack.Pop(); } state.invalid = true; return count; }
/// <summary> /// Saves a graphics container with the current state of this XGraphics and /// opens and uses a new graphics container. /// </summary> public XGraphicsContainer BeginContainer(XRect dstrect, XRect srcrect, XGraphicsUnit unit) { // TODO: unit if (unit != XGraphicsUnit.Point) throw new ArgumentException("The current implementation supports XGraphicsUnit.Point only.", "unit"); XGraphicsContainer xContainer = null; #if GDI if (this.targetContext == XGraphicTargetContext.GDI) xContainer = new XGraphicsContainer(this.gfx.Save()); #endif #if WPF if (this.targetContext == XGraphicTargetContext.WPF) xContainer = new XGraphicsContainer(); #endif InternalGraphicsState iState = new InternalGraphicsState(this, xContainer); iState.Transform = this.transform; this.gsStack.Push(iState); if (this.renderer != null) this.renderer.BeginContainer(xContainer, dstrect, srcrect, unit); XMatrix matrix = new XMatrix(); //XMatrix.Identity; #if true double scaleX = dstrect.Width / srcrect.Width; double scaleY = dstrect.Height / srcrect.Height; matrix.TranslatePrepend(-srcrect.X, -srcrect.Y); matrix.ScalePrepend(scaleX, scaleY); matrix.TranslatePrepend(dstrect.X / scaleX, dstrect.Y / scaleY); #else matrix.Translate(-dstrect.X, -dstrect.Y); matrix.Scale(dstrect.Width / srcrect.Width, dstrect.Height / srcrect.Height); matrix.Translate(srcrect.X, srcrect.Y); #endif AddTransform(matrix, XMatrixOrder.Prepend); return xContainer; }
// ----- DrawGrit ----------------------------------------------------------------------------- //[Conditional("DEBUG")] //public void DrawGridlines(XPoint origin, XPen majorpen, double majordelta, XPen minorpen, double minordelta) //{ // RectangleF box = new RectangleF(0, 0, 600, 850); // DrawGridline(origin, minorpen, minordelta, box); // DrawGridline(origin, majorpen, majordelta, box); // /* // float xmin = -10000f, ymin = -10000f, xmax = 10000f, ymax = 10000f; // float x, y; // x = origin.X; // while (x < xmax) // { // DrawLine(majorpen, x, ymin, x, ymax); // x += majordelta; // } // x = origin.X - majordelta; // while (x > xmin) // { // DrawLine(majorpen, x, ymin, x, ymax); // x -= majordelta; // } // y = origin.Y; // while (y < ymax) // { // DrawLine(majorpen, xmin, y, xmax, y); // y += majordelta; // } // y = origin.Y - majordelta; // while (y > ymin) // { // DrawLine(majorpen, xmin, y, xmax, y); // y -= majordelta; // } // */ //} //[Conditional("DEBUG")] //void DrawGridline(XPoint origin, XPen pen, double delta, XRect box) //{ // double xmin = box.X, ymin = box.Y, xmax = box.X + box.Width, ymax = box.Y + box.Height; // double x, y; // y = origin.Y; // while (y < ymax) // { // DrawLine(pen, xmin, y, xmax, y); // y += delta; // } // y = origin.Y - delta; // while (y > ymin) // { // DrawLine(pen, xmin, y, xmax, y); // y -= delta; // } // x = origin.X; // while (x < xmax) // { // DrawLine(pen, x, ymin, x, ymax); // x += delta; // } // x = origin.X - delta; // while (x > xmin) // { // DrawLine(pen, x, ymin, x, ymax); // x -= delta; // } //} #endregion // -------------------------------------------------------------------------------------------- #region Save and Restore /// <summary> /// Saves the current state of this XGraphics object and identifies the saved state with the /// returned XGraphicsState object. /// </summary> public XGraphicsState Save() { XGraphicsState xState = null; #if GDI if (this.targetContext == XGraphicTargetContext.GDI) { xState = new XGraphicsState(this.gfx.Save()); InternalGraphicsState iState = new InternalGraphicsState(this, xState); iState.Transform = this.transform; this.gsStack.Push(iState); } #endif #if WPF if (this.targetContext == XGraphicTargetContext.WPF) { xState = new XGraphicsState(); InternalGraphicsState iState = new InternalGraphicsState(this, xState); iState.Transform = this.transform; this.gsStack.Push(iState); } #endif if (this.renderer != null) this.renderer.Save(xState); return xState; }
public void Push(InternalGraphicsState state) { this.stack.Push(state); }
public void Push(InternalGraphicsState state) { _stack.Push(state); state.Pushed(); }
public GraphicsStateStack(XGraphics gfx) { _current = new InternalGraphicsState(gfx); }
/// <summary> /// Saves a graphics container with the current state of this XGraphics and /// opens and uses a new graphics container. /// </summary> public XGraphicsContainer BeginContainer(XRect dstrect, XRect srcrect, XGraphicsUnit unit) { // TODO: unit if (unit != XGraphicsUnit.Point) throw new ArgumentException("The current implementation supports XGraphicsUnit.Point only.", "unit"); #if true XGraphicsContainer xContainer = new XGraphicsContainer(this.gfx.Save()); InternalGraphicsState iState = new InternalGraphicsState(xContainer); iState.Transform = this.transform; this.gsStack.Push(iState); if (this.renderer != null) this.renderer.BeginContainer(xContainer, dstrect, srcrect, unit); XMatrix matrix = XMatrix.Identity; #if true double scaleX = dstrect.Width / srcrect.Width; double scaleY = dstrect.Height / srcrect.Height; matrix.Translate(-srcrect.X, -srcrect.Y); matrix.Scale(scaleX, scaleY); matrix.Translate(dstrect.X / scaleX, dstrect.Y / scaleY); #else matrix.Translate(-dstrect.X, -dstrect.Y); matrix.Scale(dstrect.Width / srcrect.Width, dstrect.Height / srcrect.Height); matrix.Translate(srcrect.X, srcrect.Y); #endif Transform = matrix; return xContainer; #else XGraphicsContainer container = new XGraphicsContainer(this.gfx.BeginContainer(dstrect, srcrect, this.gfx.PageUnit)); container.Transform = this.transform; if (this.renderer != null) this.renderer.BeginContainer(container, dstrect, srcrect, unit); return container; #endif }
// ----- DrawGrit ----------------------------------------------------------------------------- //[Conditional("DEBUG")] //public void DrawGridlines(XPoint origin, XPen majorpen, double majordelta, XPen minorpen, double minordelta) //{ // RectangleF box = new RectangleF(0, 0, 600, 850); // DrawGridline(origin, minorpen, minordelta, box); // DrawGridline(origin, majorpen, majordelta, box); // /* // float xmin = -10000f, ymin = -10000f, xmax = 10000f, ymax = 10000f; // float x, y; // x = origin.X; // while (x < xmax) // { // DrawLine(majorpen, x, ymin, x, ymax); // x += majordelta; // } // x = origin.X - majordelta; // while (x > xmin) // { // DrawLine(majorpen, x, ymin, x, ymax); // x -= majordelta; // } // y = origin.Y; // while (y < ymax) // { // DrawLine(majorpen, xmin, y, xmax, y); // y += majordelta; // } // y = origin.Y - majordelta; // while (y > ymin) // { // DrawLine(majorpen, xmin, y, xmax, y); // y -= majordelta; // } // */ //} //[Conditional("DEBUG")] //void DrawGridline(XPoint origin, XPen pen, double delta, XRect box) //{ // double xmin = box.X, ymin = box.Y, xmax = box.X + box.Width, ymax = box.Y + box.Height; // double x, y; // y = origin.Y; // while (y < ymax) // { // DrawLine(pen, xmin, y, xmax, y); // y += delta; // } // y = origin.Y - delta; // while (y > ymin) // { // DrawLine(pen, xmin, y, xmax, y); // y -= delta; // } // x = origin.X; // while (x < xmax) // { // DrawLine(pen, x, ymin, x, ymax); // x += delta; // } // x = origin.X - delta; // while (x > xmin) // { // DrawLine(pen, x, ymin, x, ymax); // x -= delta; // } //} #endregion // -------------------------------------------------------------------------------------------- #region Save and Restore /// <summary> /// Saves the current state of this XGraphics object and identifies the saved state with the /// returned XGraphicsState object. /// </summary> public XGraphicsState Save() { XGraphicsState xState = new XGraphicsState(this.gfx.Save()); InternalGraphicsState iState = new InternalGraphicsState(xState); iState.Transform = this.transform; this.gsStack.Push(iState); if (this.renderer != null) this.renderer.Save(xState); return xState; }