public static void ComputePointsFromTop(double controlWidth, double controlHeight, double x, double y, double r1, double r2, CornerOrigin fromCorner, out Point startPoint, out Point endPoint) { double num = x; double num2 = -num / y; double num3 = -num2; double num4 = num / (1.0 - (num2 * num3)); double num5 = num3 * num4; double num6 = Math.Sqrt((num4 * num4) + (num5 * num5)); double num7 = num4 - ((num4 * (r1 + r2)) / num6); double num8 = num5 - ((num5 * (r1 + r2)) / num6); switch (fromCorner) { case CornerOrigin.TopRight: num4 = controlWidth - num4; num7 = controlWidth - num7; break; case CornerOrigin.BottomLeft: num5 = controlHeight - num5; num8 = controlHeight - num8; break; case CornerOrigin.BottomRight: num4 = controlWidth - num4; num7 = controlWidth - num7; num5 = controlHeight - num5; num8 = controlHeight - num8; break; } startPoint = new Point(num4 / controlWidth, num5 / controlHeight); endPoint = new Point(num7 / controlWidth, num8 / controlHeight); }
public static PageParameters ResetPage(BookPage source, CornerOrigin origin) { return(new PageParameters(source.RenderSize) { Page0ShadowOpacity = 0.0, Page1ClippingFigure = new PathFigure(), Page1ReflectionStartPoint = new Point(0.0, 0.0), Page1ReflectionEndPoint = new Point(0.0, 0.0), Page1RotateAngle = 0.0, Page1RotateCenterX = 0.0, Page1RotateCenterY = 0.0, Page1TranslateX = 0.0, Page1TranslateY = 0.0, Page2ClippingFigure = new PathFigure(), Page0ShadowStartPoint = new Point(0.0, 0.0), Page0ShadowEndPoint = new Point(0.0, 0.0) }); }
public void InitPage(CornerOrigin origin) { Point p = new Point(0, 0); switch (origin) { case CornerOrigin.BottomLeft: p = new Point(0, ActualHeight); break; case CornerOrigin.BottomRight: p = new Point(ActualWidth, ActualHeight); break; case CornerOrigin.TopLeft: p = new Point(0, 0); break; case CornerOrigin.TopRight: p = new Point(ActualWidth, 0); break; } CornerPoint = p; CornerPointRefreshed(); }
private void OnMouseDown(object sender, MouseButtonEventArgs args) { if ((Status == PageStatus.DropAnimation) || (Status == PageStatus.TurnAnimation)) { return; } UIElement source = sender as UIElement; Point p = args.GetPosition(source); CornerOrigin?tmp = GetCorner(source, p); int? side = GetSide(source, p); if (side.HasValue && side == 1) { TurnPage(); return; } if (tmp.HasValue) { origin = tmp.Value; this.CaptureMouse(); } else { return; } Status = PageStatus.Dragging; }
public static double ComputeProgressRatio(BookPage source, Point p, CornerOrigin origin) { if ((origin != CornerOrigin.BottomLeft) && (origin != CornerOrigin.TopLeft)) { return((source.RenderSize.Width - p.X) / source.RenderSize.Width); } return(p.X / source.RenderSize.Width); }
private static double ComputeProgressRatio(UIElement source, Point p, CornerOrigin origin) { if ((origin == CornerOrigin.BottomLeft) || (origin == CornerOrigin.TopLeft)) { return(p.X / source.RenderSize.Width); } else { return((source.RenderSize.Width - p.X) / source.RenderSize.Width); } }
public static int ComputeAnimationDuration(BookPage source, Point p, CornerOrigin origin) { double num = ComputeProgressRatio(source, p, origin); int num2 = Convert.ToInt32((double)(s_nANIMATION_DURATION * ((num / 2.0) + 0.5))); if (num2 <= 10) { num2 = 10; } return(num2); }
private bool IsOnNextPage(Point p, UIElement source, CornerOrigin origin) { switch (origin) { case CornerOrigin.BottomLeft: case CornerOrigin.TopLeft: return(p.X > source.RenderSize.Width); default: return(p.X < 0); } }
private Point OriginToOppositePoint(UIElement source, CornerOrigin origin) { switch (origin) { case CornerOrigin.BottomLeft: return(new Point(source.RenderSize.Width * 2, source.RenderSize.Height)); case CornerOrigin.BottomRight: return(new Point(-source.RenderSize.Width, source.RenderSize.Height)); case CornerOrigin.TopRight: return(new Point(-source.RenderSize.Width, 0)); default: return(new Point(source.RenderSize.Width * 2, 0)); } }
private static PageParameters ResetPage(UIElement source, CornerOrigin origin) { PageParameters _parameters = new PageParameters(source.RenderSize); _parameters.Page0ShadowOpacity = 0; _parameters.Page1ClippingFigure = new PathFigure(); _parameters.Page1ReflectionStartPoint = new Point(0, 0); _parameters.Page1ReflectionEndPoint = new Point(0, 0); _parameters.Page1RotateAngle = 0; _parameters.Page1RotateCenterX = 0; _parameters.Page1RotateCenterY = 0; _parameters.Page1TranslateX = 0; _parameters.Page1TranslateY = 0; _parameters.Page2ClippingFigure = new PathFigure(); _parameters.Page0ShadowStartPoint = new Point(0, 0); _parameters.Page0ShadowEndPoint = new Point(0, 0); return _parameters; }
public void AutoTurnPage(CornerOrigin fromCorner, int duration) { if (Status != PageStatus.None) { return; } if (duration <= 0) { return; } Status = PageStatus.TurnAnimation; UIElement source = this as UIElement; this.BeginAnimation(BookPage.CornerPointProperty, null); Point startPoint = OriginToPoint(this, fromCorner); Point endPoint = OriginToOppositePoint(this, fromCorner); CornerPoint = startPoint; origin = fromCorner; BezierSegment bs = new BezierSegment(startPoint, new Point(endPoint.X + (startPoint.X - endPoint.X) / 3, 250), endPoint, true); PathGeometry path = new PathGeometry(); PathFigure figure = new PathFigure(); figure.StartPoint = startPoint; figure.Segments.Add(bs); figure.IsClosed = false; path.Figures.Add(figure); PointAnimationUsingPath anim = new PointAnimationUsingPath(); anim.PathGeometry = path; anim.Duration = new Duration(TimeSpan.FromMilliseconds(duration)); anim.AccelerationRatio = 0.6; anim.CurrentTimeInvalidated += anim_CurrentTimeInvalidated; anim.Completed += anim_Completed; this.BeginAnimation(BookPage.CornerPointProperty, anim); }
private static PageParameters ResetPage(UIElement source, CornerOrigin origin) { PageParameters _parameters = new PageParameters(source.RenderSize); _parameters.Page0ShadowOpacity = 0; _parameters.Page1ClippingFigure = new PathFigure(); _parameters.Page1ReflectionStartPoint = new Point(0, 0); _parameters.Page1ReflectionEndPoint = new Point(0, 0); _parameters.Page1RotateAngle = 0; _parameters.Page1RotateCenterX = 0; _parameters.Page1RotateCenterY = 0; _parameters.Page1TranslateX = 0; _parameters.Page1TranslateY = 0; _parameters.Page2ClippingFigure = new PathFigure(); _parameters.Page0ShadowStartPoint = new Point(0, 0); _parameters.Page0ShadowEndPoint = new Point(0, 0); return(_parameters); }
private void OnMouseMove(object sender, MouseEventArgs args) { UIElement source = sender as UIElement; Point p = args.GetPosition(source); DropPage(ComputeAnimationDuration(source, p, origin)); if ((Status == PageStatus.DropAnimation) || (Status == PageStatus.TurnAnimation)) { return; } //Application.Current.MainWindow.Title += "M"; if (!(sender as UIElement).IsMouseCaptured) { CornerOrigin?tmp = GetCorner(source, p); if (tmp.HasValue) { origin = tmp.Value; } else { //if (Status == PageStatus.DraggingWithoutCapture) //{ DropPage(ComputeAnimationDuration(source, p, origin)); //} return; } Status = PageStatus.DraggingWithoutCapture; } PageParameters?parameters = ComputePage(source, p, origin); _cornerPoint = p; if (parameters != null) { ApplyParameters(parameters.Value); } }
public void GrabPage(UIElement source, Point p) { if ((Status == PageStatus.DropAnimation) || (Status == PageStatus.TurnAnimation)) { return; } CornerOrigin?tmp = GetCorner(source, p); if (tmp.HasValue) { origin = tmp.Value; Status = PageStatus.Dragging; } else { Status = PageStatus.None; return; } }
public void AutoTurnPage(CornerOrigin fromCorner, int duration) { if (Status != PageStatus.None) { return; } Status = PageStatus.TurnAnimation; UIElement source = this as UIElement; Point startPoint = OriginToPoint(this, fromCorner); Point endPoint = OriginToOppositePoint(this, fromCorner); origin = fromCorner; CornerPoint = startPoint; //BezierSegment bs = // new BezierSegment { Point1 = startPoint, Point2 = new Point(endPoint.X + (startPoint.X - endPoint.X) / 3, 250), Point3 = endPoint }; //PathGeometry path = new PathGeometry(); //PathFigure figure = new PathFigure(); //figure.StartPoint = startPoint; //figure.Segments.Add(bs); //figure.IsClosed = false; //path.Figures.Add(figure); //PointAnimationUsingPath anim = // new PointAnimationUsingPath(); //anim.PathGeometry = path; //anim.Duration = new Duration(TimeSpan.FromMilliseconds(duration)); //anim.AccelerationRatio = 0.6; //anim.CurrentTimeInvalidated += new EventHandler(anim_CurrentTimeInvalidated); var anim = new TimerAnimation <Point>(this, UCPage.CornerPointProperty, endPoint, new Duration(TimeSpan.FromMilliseconds(duration)), (from, to, percent) => ComputeAutoAnimationPoints(from, to, percent)); anim.Completed += new EventHandler(anim_Completed); anim.Begin(); }
public static void ComputePointsFromTop(double controlWidth, double controlHeight, double x, double y, double r1, double r2, CornerOrigin fromCorner, out Point startPoint, out Point endPoint) { double b = x; double a = -b / y; double a2 = -a; //double xc1 = b / 2; //double yc1 = -b / (2 * a); double xc1 = b / (1 - a * a2); double yc1 = a2 * xc1; double OC1 = Math.Sqrt(xc1 * xc1 + yc1 * yc1); double xc2 = xc1 - (xc1 * (r1 + r2)) / OC1; double yc2 = yc1 - (yc1 * (r1 + r2)) / OC1; switch (fromCorner) { case CornerOrigin.TopRight: xc1 = controlWidth - xc1; xc2 = controlWidth - xc2; break; case CornerOrigin.BottomLeft: yc1 = controlHeight - yc1; yc2 = controlHeight - yc2; break; case CornerOrigin.BottomRight: xc1 = controlWidth - xc1; xc2 = controlWidth - xc2; yc1 = controlHeight - yc1; yc2 = controlHeight - yc2; break; } startPoint = new Point(xc1 / controlWidth, yc1 / controlHeight); endPoint = new Point(xc2 / controlWidth, yc2 / controlHeight); }
public static void ComputePoints(double controlWidth, double controlHeight, double x, double y, double r1, double r2, CornerOrigin fromCorner, out Point startPoint, out Point endPoint) { double b = x; double a = -b / y; double a2 = -a; double xc1 = b / (1 - a * a2); double yc1 = a2 * xc1; double OC1 = Math.Sqrt(xc1 * xc1 + yc1 * yc1); double xc2 = (xc1 * (r1 + r2)) / OC1 + xc1; double yc2 = (yc1 * (r1 + r2)) / OC1 + yc1; switch (fromCorner) { case CornerOrigin.TopRight: xc1 = controlWidth - xc1; xc2 = controlWidth - xc2; break; case CornerOrigin.BottomLeft: yc1 = controlHeight - yc1; yc2 = controlHeight - yc2; break; case CornerOrigin.BottomRight: xc1 = controlWidth - xc1; xc2 = controlWidth - xc2; yc1 = controlHeight - yc1; yc2 = controlHeight - yc2; break; } startPoint = new Point(xc1 / controlWidth, yc1 / controlHeight); endPoint = new Point(xc2 / controlWidth, yc2 / controlHeight); }
private void ContentControl_GotStylusCapture(object sender, StylusEventArgs e) { if ((Status == PageStatus.DropAnimation) || (Status == PageStatus.TurnAnimation)) { return; } UIElement source = sender as UIElement; Point p = e.GetPosition(source); CornerOrigin?tmp = GetCorner(source, p); int? side = GetSide(source, p); if (side.HasValue && side == 1 && IsBottomRightCornerEnabled) { AutoTurnPage(CornerOrigin.BottomRight, 500); return; } if (side.HasValue && side == 0 && IsBottomLeftCornerEnabled) { AutoTurnPage(CornerOrigin.BottomLeft, 500); return; } if (tmp.HasValue) { origin = tmp.Value; this.CaptureMouse(); } else { return; } Status = PageStatus.Dragging; }
private static PageParameters? ComputePage(UIElement source, Point p, CornerOrigin origin) { CheckParams(ref source, ref p, origin); PageParameters _parameters = new PageParameters(source.RenderSize); double ratio = 0; // = ComputeProgressRatio(source, p, origin); if (ratio > 1.5) ratio = (2 - ratio) / 0.5; else ratio = 1; _parameters.Page0ShadowOpacity = ratio; double xc = source.RenderSize.Width; double yc = source.RenderSize.Height;//5_1_a_s_p_x switch (origin) { case CornerOrigin.TopLeft: p.X = xc - p.X; p.Y = yc - p.Y; break; case CornerOrigin.TopRight: p.Y = yc - p.Y; break; case CornerOrigin.BottomLeft: p.X = xc - p.X; break; } if (p.X >= xc) return null; // x = a * y + b double a = -(p.Y - yc) / (p.X - xc); double b = (xc + p.X) / 2 - a * ((yc + p.Y) / 2); double h1 = (xc - b) / a; double l1 = a * yc + b; double angle = (Math.Atan((xc - p.X) / (h1 - p.Y))) * 180 / Math.PI; if ((a < 0) && (p.Y < h1)) angle = angle - 180; switch (origin) { case CornerOrigin.BottomRight: _parameters.Page1RotateAngle = -angle; _parameters.Page1RotateCenterX = p.X; _parameters.Page1RotateCenterY = p.Y; _parameters.Page1TranslateX = p.X; _parameters.Page1TranslateY = p.Y - yc; break; case CornerOrigin.TopLeft: _parameters.Page1RotateAngle = -angle; _parameters.Page1RotateCenterX = xc - p.X; _parameters.Page1RotateCenterY = yc - p.Y; _parameters.Page1TranslateX = -p.X; _parameters.Page1TranslateY = yc - p.Y; break; case CornerOrigin.TopRight: _parameters.Page1RotateAngle = angle; _parameters.Page1RotateCenterX = p.X; _parameters.Page1RotateCenterY = yc - p.Y; _parameters.Page1TranslateX = p.X; _parameters.Page1TranslateY = yc - p.Y; break; case CornerOrigin.BottomLeft: _parameters.Page1RotateAngle = angle; _parameters.Page1RotateCenterX = xc - p.X; _parameters.Page1RotateCenterY = p.Y; _parameters.Page1TranslateX = -p.X; _parameters.Page1TranslateY = p.Y - yc; break; } switch (origin) { case CornerOrigin.BottomRight: if (angle < 0) { _parameters.Page1ClippingFigure.StartPoint = new Point(0, yc); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(xc - l1, yc) }); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(0, h1) }); } else { _parameters.Page1ClippingFigure.StartPoint = new Point(0, 0); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(xc - b, 0) }); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(0, h1) }); } break; case CornerOrigin.TopLeft: if (angle < 0) { _parameters.Page1ClippingFigure.StartPoint = new Point(xc, 0); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(l1, 0) }); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(xc, yc - h1) }); } else { _parameters.Page1ClippingFigure.StartPoint = new Point(xc, yc); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(b, yc) }); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(xc, yc - h1) }); } break; case CornerOrigin.BottomLeft: if (angle < 0) { _parameters.Page1ClippingFigure.StartPoint = new Point(xc, yc); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(l1, yc) }); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(xc, h1) }); } else { _parameters.Page1ClippingFigure.StartPoint = new Point(xc, 0); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(b, 0) }); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(xc, h1) }); } break; case CornerOrigin.TopRight: if (angle < 0) { _parameters.Page1ClippingFigure.StartPoint = new Point(0, 0); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(xc - l1, 0) }); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(0, yc - h1) }); } else { _parameters.Page1ClippingFigure.StartPoint = new Point(0, yc); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(xc - b, yc) }); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment { Point = new Point(0, yc - h1) }); } break; } _parameters.Page2ClippingFigure.StartPoint = new Point(xc - _parameters.Page1ClippingFigure.StartPoint.X, _parameters.Page1ClippingFigure.StartPoint.Y); _parameters.Page2ClippingFigure.Segments = _parameters.Page1ClippingFigure.Segments.Clone(); ((LineSegment)_parameters.Page2ClippingFigure.Segments[0]).Point = new Point(xc - ((LineSegment)_parameters.Page2ClippingFigure.Segments[0]).Point.X, ((LineSegment)_parameters.Page2ClippingFigure.Segments[0]).Point.Y); ((LineSegment)_parameters.Page2ClippingFigure.Segments[1]).Point = new Point(xc - ((LineSegment)_parameters.Page2ClippingFigure.Segments[1]).Point.X, ((LineSegment)_parameters.Page2ClippingFigure.Segments[1]).Point.Y); Point refletStartPoint; Point refletEndPoint; CornerOrigin oppositeOrigin = CornerOrigin.TopLeft; switch (origin) { case CornerOrigin.BottomLeft: oppositeOrigin = CornerOrigin.BottomRight; break; case CornerOrigin.BottomRight: oppositeOrigin = CornerOrigin.BottomLeft; break; case CornerOrigin.TopLeft: oppositeOrigin = CornerOrigin.TopRight; break; case CornerOrigin.TopRight: oppositeOrigin = CornerOrigin.TopLeft; break; } LinearGradientHelper.ComputePointsFromTop(xc, yc, xc - l1, yc - h1, 20, 20, oppositeOrigin, out refletStartPoint, out refletEndPoint); _parameters.Page1ReflectionStartPoint = refletStartPoint; _parameters.Page1ReflectionEndPoint = refletEndPoint; //new Point(1, 1 / Math.Tan((90 - angleClipping) * Math.PI / 180)); Point startPoint; Point endPoint; double d = Math.Sqrt(Math.Pow(p.X - xc, 2) + Math.Pow(p.Y - yc, 2)); double r1 = d / 10; double r2 = d / 10; LinearGradientHelper.ComputePoints(xc, yc, xc - l1, yc - h1, r1, r2, origin, out startPoint, out endPoint); _parameters.Page0ShadowStartPoint = startPoint; _parameters.Page0ShadowEndPoint = endPoint; return _parameters; }
public void TurnPageFromCorner(CornerOrigin refStarterCornerOrigin, int nAnimationDuration) { if (this.Status != PageStatus.Idle) return; this.SetValue(BookPage.StatusPropertyKey, (object)PageStatus.TurnAnimation); this.BeginAnimation(BookPage.CornerPointProperty, (AnimationTimeline)null); this.DisableManipulation(); Point point1 = this.OriginToPoint(refStarterCornerOrigin); if (refStarterCornerOrigin == CornerOrigin.BottomRight || refStarterCornerOrigin == CornerOrigin.BottomLeft) point1.Y -= BookPage.s_dOFFSET_TO_AVOID_GLITCH; Point point3 = this.OriginToOppositePoint(refStarterCornerOrigin); this.m_ptCornerPoint = this.CornerPoint = point1; this.m_refCornerOrigin = refStarterCornerOrigin; BezierSegment bezierSegment = new BezierSegment(point1, new Point(point3.X + (point1.X - point3.X) / 3.0, 250.0), point3, true); PathGeometry pathGeometry = new PathGeometry(); pathGeometry.Figures.Add(new PathFigure() { StartPoint = point1, Segments = { (PathSegment) bezierSegment }, IsClosed = false }); if (this.m_refAnimation != null) { this.m_refAnimation.CurrentTimeInvalidated -= new EventHandler(this.OnAnimationCurrentTimeInvalidated); this.m_refAnimation.CurrentStateInvalidated -= new EventHandler(this.OnAnimationCurrentStateInvalidated); } this.m_refAnimation = (PointAnimationBase)new PointAnimationUsingPath(); (this.m_refAnimation as PointAnimationUsingPath).PathGeometry = pathGeometry; this.m_refAnimation.Duration = new Duration(TimeSpan.FromMilliseconds((double)nAnimationDuration)); this.m_refAnimation.AccelerationRatio = 0.6; this.m_refAnimation.CurrentTimeInvalidated += new EventHandler(this.OnAnimationCurrentTimeInvalidated); this.m_refAnimation.CurrentStateInvalidated += new EventHandler(this.OnAnimationCurrentStateInvalidated); this.BeginAnimation(BookPage.CornerPointProperty, (AnimationTimeline)this.m_refAnimation); }
protected virtual void OnCornerInputDeviceDown(InputEventArgs e) { Rectangle rctCorner = e.Source as Rectangle; if (rctCorner == null || rctCorner.AreAnyTouchesCaptured || (!this.m_bCanStarNanipulation || !this.m_bDraggingEnabled)) return; e.Handled = true; if (this.Status == Enums.PageStatus.DropAnimation || this.Status == Enums.PageStatus.Dragging) return; if (this.Status == Enums.PageStatus.TurnAnimation) { this.BeginAnimation(BookPage.CornerPointProperty, (AnimationTimeline)null); this.RaisePageTurnedEvent(); } TouchExtensions.Capture(e.Device, (IInputElement)rctCorner); this.m_ptTapPoint = TouchExtensions.GetPosition(e.Device, (IInputElement)this); this.m_refTapTimer.Start(); this.m_refFlickTimer.Start(); this.m_dateStartFlick = DateTime.Now; Point position = TouchExtensions.GetPosition(e.Device, (IInputElement)this); CornerOrigin cornerOrigin = this.GetCornerOrigin(rctCorner, position); this.m_refCornerOrigin = cornerOrigin; if (this.IsInsideBoundingBox(position)) { this.m_bContactAlreadyInsidePage = true; Point p = position; if (this.m_rctSideLeft != null && rctCorner == this.m_rctSideLeft || this.m_rctSideRight != null && rctCorner == this.m_rctSideRight) p.Y = this.OriginToPoint(cornerOrigin).Y; PageParameters? page = BookPageComputeHelper.ComputePage(this, p, cornerOrigin); this.CornerPoint = this.m_ptCornerPoint = p; if (page.HasValue) this.ApplyParameters(page.Value); this.SetValue(BookPage.StatusPropertyKey, (object)PageStatus.Dragging); } else { this.m_ptCornerPoint = position; if (this.IsRightPage && this.m_ptCornerPoint.X > this.ActualWidth) this.m_ptCornerPoint.X = this.ActualWidth; if (this.IsLeftPage && this.m_ptCornerPoint.X < 0.0) this.m_ptCornerPoint.X = 0.0; if (this.m_ptCornerPoint.Y > this.ActualHeight) this.m_ptCornerPoint.Y = this.ActualHeight; if (this.m_ptCornerPoint.Y < 0.0) this.m_ptCornerPoint.Y = 0.0; this.CornerPoint = this.m_ptCornerPoint; } }
private bool IsOnNextPage(Point p, UIElement source, CornerOrigin origin) { switch (origin) { case CornerOrigin.BottomLeft: case CornerOrigin.TopLeft: return p.X > source.RenderSize.Width; default: return p.X < 0; } }
private static int ComputeAnimationDuration(UIElement source, Point p, CornerOrigin origin) { double ratio = ComputeProgressRatio(source, p, origin); return Convert.ToInt32(animationDuration * (ratio / 2 + 0.5)); }
public void GrabPage(UIElement source, Point p) { if ((Status == PageStatus.DropAnimation) || (Status == PageStatus.TurnAnimation)) return; CornerOrigin? tmp = GetCorner(source, p); if (tmp.HasValue) { origin = tmp.Value; Status = PageStatus.Dragging; } else { Status = PageStatus.None; return; } }
private static void CheckParams(ref UIElement source, ref Point p, CornerOrigin origin) { switch (origin) { case CornerOrigin.TopRight: if (origin == CornerOrigin.TopRight) { if (p.Y == 0) { p.Y = epsilon; } if (p.X == 0) { p.X = epsilon; } if (p.Y > 0) { double d = Math.Sqrt(p.X * p.X + p.Y * p.Y); if (d > source.RenderSize.Width) { double x = p.X * source.RenderSize.Width / d; double y = p.Y * source.RenderSize.Width / d; p.X = x; p.Y = y; } } else { double d = Math.Sqrt(p.X * p.X + p.Y * p.Y); double R = Math.Sqrt(source.RenderSize.Width * source.RenderSize.Width + source.RenderSize.Height * source.RenderSize.Height); double a = (p.Y * p.Y) / (p.X * p.X) + 1; double b = -2 * p.Y * source.RenderSize.Height / p.X; double c = source.RenderSize.Height * source.RenderSize.Height - R * R; double delta = b * b - 4 * a * c; double x = 0; if (p.X > 0) { x = (-b + Math.Sqrt(delta)) / (2 * a); } else { x = (-b - Math.Sqrt(delta)) / (2 * a); } double y = p.Y * x / p.X; if (Math.Abs(x) < Math.Abs(p.X)) { p.X = x; p.Y = y; } } if (source.RenderSize.Width - p.X == p.Y) { p.X += epsilon; } } break; case CornerOrigin.TopLeft: p.X = source.RenderSize.Width - p.X; CheckParams(ref source, ref p, CornerOrigin.TopRight); p.X = source.RenderSize.Width - p.X; break; case CornerOrigin.BottomRight: p.Y = source.RenderSize.Height - p.Y; CheckParams(ref source, ref p, CornerOrigin.TopRight); p.Y = source.RenderSize.Height - p.Y; break; case CornerOrigin.BottomLeft: p.Y = source.RenderSize.Height - p.Y; p.X = source.RenderSize.Width - p.X; CheckParams(ref source, ref p, CornerOrigin.TopRight); p.Y = source.RenderSize.Height - p.Y; p.X = source.RenderSize.Width - p.X; break; } }
private static void CheckParams(ref UIElement source, ref Point p, CornerOrigin origin) { switch (origin) { case CornerOrigin.TopRight: if (origin == CornerOrigin.TopRight) { if (p.Y == 0) p.Y = epsilon; if (p.X == 0) p.X = epsilon; if (p.Y > 0) { double d = Math.Sqrt(p.X * p.X + p.Y * p.Y); if (d > source.RenderSize.Width) { double x = p.X * source.RenderSize.Width / d; double y = p.Y * source.RenderSize.Width / d; p.X = x; p.Y = y; } } else { double d = Math.Sqrt(p.X * p.X + p.Y * p.Y); double R = Math.Sqrt(source.RenderSize.Width * source.RenderSize.Width + source.RenderSize.Height * source.RenderSize.Height); double a = (p.Y * p.Y) / (p.X * p.X) + 1; double b = -2 * p.Y * source.RenderSize.Height / p.X; double c = source.RenderSize.Height * source.RenderSize.Height - R * R; double delta = b * b - 4 * a * c; double x = 0; if (p.X > 0) x = (-b + Math.Sqrt(delta)) / (2 * a); else x = (-b - Math.Sqrt(delta)) / (2 * a); double y = p.Y * x / p.X; if (Math.Abs(x) < Math.Abs(p.X)) { p.X = x; p.Y = y; } } if (source.RenderSize.Width - p.X == p.Y) p.X += epsilon; } break; case CornerOrigin.TopLeft: p.X = source.RenderSize.Width - p.X; CheckParams(ref source, ref p, CornerOrigin.TopRight); p.X = source.RenderSize.Width - p.X; break; case CornerOrigin.BottomRight: p.Y = source.RenderSize.Height - p.Y; CheckParams(ref source, ref p, CornerOrigin.TopRight); p.Y = source.RenderSize.Height - p.Y; break; case CornerOrigin.BottomLeft: p.Y = source.RenderSize.Height - p.Y; p.X = source.RenderSize.Width - p.X; CheckParams(ref source, ref p, CornerOrigin.TopRight); p.Y = source.RenderSize.Height - p.Y; p.X = source.RenderSize.Width - p.X; break; } }
private static int ComputeAnimationDuration(UIElement source, Point p, CornerOrigin origin) { double ratio = ComputeProgressRatio(source, p, origin); return(Convert.ToInt32(animationDuration * (ratio / 2 + 0.5))); }
private void OnMouseMove(object sender, MouseEventArgs args) { if ((Status == PageStatus.DropAnimation) || (Status == PageStatus.TurnAnimation)) return; //Application.Current.MainWindow.Title += "M"; UIElement source = sender as UIElement; Point p = args.GetPosition(source); if (!(sender as UIElement).IsMouseCaptured) { CornerOrigin? tmp = GetCorner(source, p); if (tmp.HasValue) origin = tmp.Value; else { if (Status == PageStatus.DraggingWithoutCapture) { DropPage(ComputeAnimationDuration(source, p, origin)); } return; } Status = PageStatus.DraggingWithoutCapture; } PageParameters? parameters = ComputePage(source, p, origin); _cornerPoint = p; if (parameters != null) ApplyParameters(parameters.Value); }
public static PageParameters?ComputePage(BookPage source, Point p, CornerOrigin origin) { Point point; Point point2; Point point3; Point point4; CheckParams(ref source, ref p, origin); PageParameters parameters = new PageParameters(source.RenderSize); double num = ComputeProgressRatio(source, p, origin); if (num > 1.5) { num = (2.0 - num) / 0.5; } else { num = 1.0; } parameters.Page0ShadowOpacity = num; double width = source.RenderSize.Width; double height = source.RenderSize.Height; switch (origin) { case CornerOrigin.TopLeft: p.X = width - p.X; p.Y = height - p.Y; break; case CornerOrigin.TopRight: p.Y = height - p.Y; break; case CornerOrigin.BottomLeft: p.X = width - p.X; break; } if (p.X >= width) { return(null); } double num4 = -(p.Y - height) / (p.X - width); double x = ((width + p.X) / 2.0) - (num4 * ((height + p.Y) / 2.0)); double y = (width - x) / num4; double num7 = (num4 * height) + x; double num8 = (Math.Atan((width - p.X) / (y - p.Y)) * 180.0) / 3.1415926535897931; if ((num4 < 0.0) && (p.Y < y)) { num8 -= 180.0; } switch (origin) { case CornerOrigin.TopLeft: parameters.Page1RotateAngle = -num8; parameters.Page1RotateCenterX = width - p.X; parameters.Page1RotateCenterY = height - p.Y; parameters.Page1TranslateX = -p.X; parameters.Page1TranslateY = height - p.Y; break; case CornerOrigin.TopRight: parameters.Page1RotateAngle = num8; parameters.Page1RotateCenterX = p.X; parameters.Page1RotateCenterY = height - p.Y; parameters.Page1TranslateX = p.X; parameters.Page1TranslateY = height - p.Y; break; case CornerOrigin.BottomLeft: parameters.Page1RotateAngle = num8; parameters.Page1RotateCenterX = width - p.X; parameters.Page1RotateCenterY = p.Y; parameters.Page1TranslateX = -p.X; parameters.Page1TranslateY = p.Y - height; break; case CornerOrigin.BottomRight: parameters.Page1RotateAngle = -num8; parameters.Page1RotateCenterX = p.X; parameters.Page1RotateCenterY = p.Y; parameters.Page1TranslateX = p.X; parameters.Page1TranslateY = p.Y - height; break; } switch (origin) { case CornerOrigin.TopLeft: if (num8 >= 0.0) { parameters.Page1ClippingFigure.StartPoint = new Point(width, height); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(x, height), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width, height - y), false)); break; } parameters.Page1ClippingFigure.StartPoint = new Point(width, 0.0); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(num7, 0.0), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width, height - y), false)); break; case CornerOrigin.TopRight: if (num8 >= 0.0) { parameters.Page1ClippingFigure.StartPoint = new Point(0.0, height); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width - x, height), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0.0, height - y), false)); break; } parameters.Page1ClippingFigure.StartPoint = new Point(0.0, 0.0); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width - num7, 0.0), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0.0, height - y), false)); break; case CornerOrigin.BottomLeft: if (num8 >= 0.0) { parameters.Page1ClippingFigure.StartPoint = new Point(width, 0.0); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(x, 0.0), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width, y), false)); break; } parameters.Page1ClippingFigure.StartPoint = new Point(width, height); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(num7, height), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width, y), false)); break; case CornerOrigin.BottomRight: if (num8 >= 0.0) { parameters.Page1ClippingFigure.StartPoint = new Point(0.0, 0.0); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width - x, 0.0), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0.0, y), false)); break; } parameters.Page1ClippingFigure.StartPoint = new Point(0.0, height); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width - num7, height), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0.0, y), false)); break; } parameters.Page2ClippingFigure.StartPoint = new Point(width - parameters.Page1ClippingFigure.StartPoint.X, parameters.Page1ClippingFigure.StartPoint.Y); parameters.Page2ClippingFigure.Segments = parameters.Page1ClippingFigure.Segments.Clone(); ((LineSegment)parameters.Page2ClippingFigure.Segments[0]).Point = new Point(width - ((LineSegment)parameters.Page2ClippingFigure.Segments[0]).Point.X, ((LineSegment)parameters.Page2ClippingFigure.Segments[0]).Point.Y); ((LineSegment)parameters.Page2ClippingFigure.Segments[1]).Point = new Point(width - ((LineSegment)parameters.Page2ClippingFigure.Segments[1]).Point.X, ((LineSegment)parameters.Page2ClippingFigure.Segments[1]).Point.Y); CornerOrigin topLeft = CornerOrigin.TopLeft; switch (origin) { case CornerOrigin.TopLeft: topLeft = CornerOrigin.TopRight; break; case CornerOrigin.TopRight: topLeft = CornerOrigin.TopLeft; break; case CornerOrigin.BottomLeft: topLeft = CornerOrigin.BottomRight; break; case CornerOrigin.BottomRight: topLeft = CornerOrigin.BottomLeft; break; } NLinearGradientHelper.ComputePointsFromTop(width, height, width - num7, height - y, 20.0, 20.0, topLeft, out point, out point2); parameters.Page1ReflectionStartPoint = point; parameters.Page1ReflectionEndPoint = point2; double num9 = Math.Sqrt(Math.Pow(p.X - width, 2.0) + Math.Pow(p.Y - height, 2.0)); double num10 = num9 / 10.0; double num11 = num9 / 10.0; NLinearGradientHelper.ComputePoints(width, height, width - num7, height - y, num10, num11, origin, out point3, out point4); parameters.Page0ShadowStartPoint = point3; parameters.Page0ShadowEndPoint = point4; return(new PageParameters?(parameters)); }
public void ExecuteIdleAnimation(int corner) { Path path = (Path)null; switch (corner) { case 1: if (this.IsRightPage) { path = this.m_refPART_IdleAnimationPathTopRight; this.m_refCornerOrigin = CornerOrigin.TopRight; break; } else { path = this.m_refPART_IdleAnimationPathTopLeft; this.m_refCornerOrigin = CornerOrigin.TopLeft; break; } case 2: if (this.IsRightPage) { path = this.m_refPART_IdleAnimationPathBottomRight; this.m_refCornerOrigin = CornerOrigin.BottomRight; break; } else { path = this.m_refPART_IdleAnimationPathBottomLeft; this.m_refCornerOrigin = CornerOrigin.BottomLeft; break; } } if (this.Status != PageStatus.Idle || path == null) return; Geometry renderedGeometry = path.RenderedGeometry; if (renderedGeometry == null) return; if (this.m_refPART_ShadowCanvas != null) this.m_refPART_ShadowCanvas.Visibility = Visibility.Visible; if (this.m_refPART_ReflectionCanvas != null) this.m_refPART_ReflectionCanvas.Visibility = Visibility.Visible; this.m_ptCornerPoint = this.CornerPoint = this.OriginToPoint(this.m_refCornerOrigin); PageParameters? page = BookPageComputeHelper.ComputePage(this, this.m_ptCornerPoint, this.m_refCornerOrigin); if (page.HasValue) this.ApplyParameters(page.Value); this.BeginAnimation(BookPage.CornerPointProperty, (AnimationTimeline)null); if (this.m_refAnimation != null) { this.m_refAnimation.CurrentTimeInvalidated -= new EventHandler(this.OnAnimationCurrentTimeInvalidated); this.m_refAnimation.CurrentStateInvalidated -= new EventHandler(this.OnAnimationCurrentStateInvalidated); } this.m_refAnimation = (PointAnimationBase)new PointAnimationUsingPath(); this.m_refAnimation.AccelerationRatio = 0.1; this.m_refAnimation.DecelerationRatio = 0.9; this.m_refAnimation.Duration = (Duration)TimeSpan.FromMilliseconds((double)BookPage.s_nIDLE_ANIMATION_DURATION); PathGeometry pathGeometry = new PathGeometry((IEnumerable<PathFigure>)PathFigureCollection.Parse(new GeometryValueSerializer().ConvertToString((object)renderedGeometry, (IValueSerializerContext)null))); pathGeometry.Transform = (Transform)this.TransformToVisual((Visual)path).Inverse; pathGeometry.Freeze(); (this.m_refAnimation as PointAnimationUsingPath).PathGeometry = pathGeometry; this.m_refAnimation.CurrentTimeInvalidated += new EventHandler(this.OnIdleAnimationCurrentTimeInvalidated); this.m_refAnimation.CurrentStateInvalidated += new EventHandler(this.OnIdleAnimationCurrentStateInvalidated); this.BeginAnimation(BookPage.CornerPointProperty, (AnimationTimeline)this.m_refAnimation); }
protected virtual bool IsOnNextPage(Point refPoint, CornerOrigin refCornerOrigin) { switch (refCornerOrigin) { case CornerOrigin.TopLeft: case CornerOrigin.BottomLeft: return refPoint.X > this.RenderSize.Width; default: return refPoint.X < 0.0; } }
// Methods public static void CheckParams(ref BookPage source, ref Point p, CornerOrigin origin) { switch (origin) { case CornerOrigin.TopLeft: p.X = source.RenderSize.Width - p.X; CheckParams(ref source, ref p, CornerOrigin.TopRight); p.X = source.RenderSize.Width - p.X; return; case CornerOrigin.TopRight: if (origin != CornerOrigin.TopRight) { break; } if (p.Y == 0.0) { p.Y = s_dEPSILON; } if (p.X == 0.0) { p.X = s_dEPSILON; } if (p.Y > 0.0) { double num = Math.Sqrt((p.X * p.X) + (p.Y * p.Y)); if (num > source.RenderSize.Width) { double num2 = (p.X * source.RenderSize.Width) / num; double num3 = (p.Y * source.RenderSize.Width) / num; p.X = num2; p.Y = num3; } } else { Math.Sqrt((p.X * p.X) + (p.Y * p.Y)); double num4 = Math.Sqrt((source.RenderSize.Width * source.RenderSize.Width) + (source.RenderSize.Height * source.RenderSize.Height)); double num5 = ((p.Y * p.Y) / (p.X * p.X)) + 1.0; double num6 = ((-2.0 * p.Y) * source.RenderSize.Height) / p.X; double num7 = (source.RenderSize.Height * source.RenderSize.Height) - (num4 * num4); double d = (num6 * num6) - ((4.0 * num5) * num7); double num9 = 0.0; if (p.X > 0.0) { num9 = (-num6 + Math.Sqrt(d)) / (2.0 * num5); } else { num9 = (-num6 - Math.Sqrt(d)) / (2.0 * num5); } double num10 = (p.Y * num9) / p.X; if (Math.Abs(num9) < Math.Abs(p.X)) { p.X = num9; p.Y = num10; } } if ((source.RenderSize.Width - p.X) != p.Y) { break; } p.X += s_dEPSILON; return; case CornerOrigin.BottomLeft: p.Y = source.RenderSize.Height - p.Y; p.X = source.RenderSize.Width - p.X; CheckParams(ref source, ref p, CornerOrigin.TopRight); p.Y = source.RenderSize.Height - p.Y; p.X = source.RenderSize.Width - p.X; break; case CornerOrigin.BottomRight: p.Y = source.RenderSize.Height - p.Y; CheckParams(ref source, ref p, CornerOrigin.TopRight); p.Y = source.RenderSize.Height - p.Y; return; default: return; } }
public static int ComputeAnimationDuration(BookPage source, Point p, CornerOrigin origin) { double num = ComputeProgressRatio(source, p, origin); int num2 = Convert.ToInt32((double)(s_nANIMATION_DURATION * ((num / 2.0) + 0.5))); if (num2 <= 10) { num2 = 10; } return num2; }
public static void ComputePoints(double controlWidth, double controlHeight, double x, double y, double r1, double r2, CornerOrigin fromCorner, out Point startPoint, out Point endPoint) { double num = x; double num2 = -num / y; double num3 = -num2; double num4 = num / (1.0 - (num2 * num3)); double num5 = num3 * num4; double num6 = Math.Sqrt((num4 * num4) + (num5 * num5)); double num7 = ((num4 * (r1 + r2)) / num6) + num4; double num8 = ((num5 * (r1 + r2)) / num6) + num5; switch (fromCorner) { case CornerOrigin.TopRight: num4 = controlWidth - num4; num7 = controlWidth - num7; break; case CornerOrigin.BottomLeft: num5 = controlHeight - num5; num8 = controlHeight - num8; break; case CornerOrigin.BottomRight: num4 = controlWidth - num4; num7 = controlWidth - num7; num5 = controlHeight - num5; num8 = controlHeight - num8; break; } startPoint = new Point(num4 / controlWidth, num5 / controlHeight); endPoint = new Point(num7 / controlWidth, num8 / controlHeight); }
private static PageParameters?ComputePage(UIElement source, Point p, CornerOrigin origin) { CheckParams(ref source, ref p, origin); PageParameters _parameters = new PageParameters(source.RenderSize); double ratio = ComputeProgressRatio(source, p, origin); if (ratio > 1.5) { ratio = (2 - ratio) / 0.5; } else { ratio = 1; } _parameters.Page0ShadowOpacity = ratio; double xc = source.RenderSize.Width; double yc = source.RenderSize.Height; switch (origin) { case CornerOrigin.TopLeft: p.X = xc - p.X; p.Y = yc - p.Y; break; case CornerOrigin.TopRight: p.Y = yc - p.Y; break; case CornerOrigin.BottomLeft: p.X = xc - p.X; break; } if (p.X >= xc) { return(null); } // x = a * y + b double a = -(p.Y - yc) / (p.X - xc); double b = (xc + p.X) / 2 - a * ((yc + p.Y) / 2); double h1 = (xc - b) / a; double l1 = a * yc + b; double angle = (Math.Atan((xc - p.X) / (h1 - p.Y))) * 180 / Math.PI; if ((a < 0) && (p.Y < h1)) { angle = angle - 180; } switch (origin) { case CornerOrigin.BottomRight: _parameters.Page1RotateAngle = -angle; _parameters.Page1RotateCenterX = p.X; _parameters.Page1RotateCenterY = p.Y; _parameters.Page1TranslateX = p.X; _parameters.Page1TranslateY = p.Y - yc; break; case CornerOrigin.TopLeft: _parameters.Page1RotateAngle = -angle; _parameters.Page1RotateCenterX = xc - p.X; _parameters.Page1RotateCenterY = yc - p.Y; _parameters.Page1TranslateX = -p.X; _parameters.Page1TranslateY = yc - p.Y; break; case CornerOrigin.TopRight: _parameters.Page1RotateAngle = angle; _parameters.Page1RotateCenterX = p.X; _parameters.Page1RotateCenterY = yc - p.Y; _parameters.Page1TranslateX = p.X; _parameters.Page1TranslateY = yc - p.Y; break; case CornerOrigin.BottomLeft: _parameters.Page1RotateAngle = angle; _parameters.Page1RotateCenterX = xc - p.X; _parameters.Page1RotateCenterY = p.Y; _parameters.Page1TranslateX = -p.X; _parameters.Page1TranslateY = p.Y - yc; break; } switch (origin) { case CornerOrigin.BottomRight: if (angle < 0) { _parameters.Page1ClippingFigure.StartPoint = new Point(0, yc); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(xc - l1, yc), false)); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0, h1), false)); } else { _parameters.Page1ClippingFigure.StartPoint = new Point(0, 0); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(xc - b, 0), false)); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0, h1), false)); } break; case CornerOrigin.TopLeft: if (angle < 0) { _parameters.Page1ClippingFigure.StartPoint = new Point(xc, 0); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(l1, 0), false)); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(xc, yc - h1), false)); } else { _parameters.Page1ClippingFigure.StartPoint = new Point(xc, yc); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(b, yc), false)); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(xc, yc - h1), false)); } break; case CornerOrigin.BottomLeft: if (angle < 0) { _parameters.Page1ClippingFigure.StartPoint = new Point(xc, yc); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(l1, yc), false)); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(xc, h1), false)); } else { _parameters.Page1ClippingFigure.StartPoint = new Point(xc, 0); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(b, 0), false)); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(xc, h1), false)); } break; case CornerOrigin.TopRight: if (angle < 0) { _parameters.Page1ClippingFigure.StartPoint = new Point(0, 0); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(xc - l1, 0), false)); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0, yc - h1), false)); } else { _parameters.Page1ClippingFigure.StartPoint = new Point(0, yc); _parameters.Page1ClippingFigure.Segments.Clear(); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(xc - b, yc), false)); _parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0, yc - h1), false)); } break; } _parameters.Page2ClippingFigure.StartPoint = new Point(xc - _parameters.Page1ClippingFigure.StartPoint.X, _parameters.Page1ClippingFigure.StartPoint.Y); _parameters.Page2ClippingFigure.Segments = _parameters.Page1ClippingFigure.Segments.Clone(); ((LineSegment)_parameters.Page2ClippingFigure.Segments[0]).Point = new Point(xc - ((LineSegment)_parameters.Page2ClippingFigure.Segments[0]).Point.X, ((LineSegment)_parameters.Page2ClippingFigure.Segments[0]).Point.Y); ((LineSegment)_parameters.Page2ClippingFigure.Segments[1]).Point = new Point(xc - ((LineSegment)_parameters.Page2ClippingFigure.Segments[1]).Point.X, ((LineSegment)_parameters.Page2ClippingFigure.Segments[1]).Point.Y); Point refletStartPoint; Point refletEndPoint; CornerOrigin oppositeOrigin = CornerOrigin.TopLeft; switch (origin) { case CornerOrigin.BottomLeft: oppositeOrigin = CornerOrigin.BottomRight; break; case CornerOrigin.BottomRight: oppositeOrigin = CornerOrigin.BottomLeft; break; case CornerOrigin.TopLeft: oppositeOrigin = CornerOrigin.TopRight; break; case CornerOrigin.TopRight: oppositeOrigin = CornerOrigin.TopLeft; break; } LinearGradientHelper.ComputePointsFromTop(xc, yc, xc - l1, yc - h1, 20, 20, oppositeOrigin, out refletStartPoint, out refletEndPoint); _parameters.Page1ReflectionStartPoint = refletStartPoint; _parameters.Page1ReflectionEndPoint = refletEndPoint; //new Point(1, 1 / Math.Tan((90 - angleClipping) * Math.PI / 180)); Point startPoint; Point endPoint; double d = Math.Sqrt(Math.Pow(p.X - xc, 2) + Math.Pow(p.Y - yc, 2)); double r1 = d / 10; double r2 = d / 10; LinearGradientHelper.ComputePoints(xc, yc, xc - l1, yc - h1, r1, r2, origin, out startPoint, out endPoint); _parameters.Page0ShadowStartPoint = startPoint; _parameters.Page0ShadowEndPoint = endPoint; return(_parameters); }
public static PageParameters? ComputePage(BookPage source, Point p, CornerOrigin origin) { Point point; Point point2; Point point3; Point point4; CheckParams(ref source, ref p, origin); PageParameters parameters = new PageParameters(source.RenderSize); double num = ComputeProgressRatio(source, p, origin); if (num > 1.5) { num = (2.0 - num) / 0.5; } else { num = 1.0; } parameters.Page0ShadowOpacity = num; double width = source.RenderSize.Width; double height = source.RenderSize.Height; switch (origin) { case CornerOrigin.TopLeft: p.X = width - p.X; p.Y = height - p.Y; break; case CornerOrigin.TopRight: p.Y = height - p.Y; break; case CornerOrigin.BottomLeft: p.X = width - p.X; break; } if (p.X >= width) { return null; } double num4 = -(p.Y - height) / (p.X - width); double x = ((width + p.X) / 2.0) - (num4 * ((height + p.Y) / 2.0)); double y = (width - x) / num4; double num7 = (num4 * height) + x; double num8 = (Math.Atan((width - p.X) / (y - p.Y)) * 180.0) / 3.1415926535897931; if ((num4 < 0.0) && (p.Y < y)) { num8 -= 180.0; } switch (origin) { case CornerOrigin.TopLeft: parameters.Page1RotateAngle = -num8; parameters.Page1RotateCenterX = width - p.X; parameters.Page1RotateCenterY = height - p.Y; parameters.Page1TranslateX = -p.X; parameters.Page1TranslateY = height - p.Y; break; case CornerOrigin.TopRight: parameters.Page1RotateAngle = num8; parameters.Page1RotateCenterX = p.X; parameters.Page1RotateCenterY = height - p.Y; parameters.Page1TranslateX = p.X; parameters.Page1TranslateY = height - p.Y; break; case CornerOrigin.BottomLeft: parameters.Page1RotateAngle = num8; parameters.Page1RotateCenterX = width - p.X; parameters.Page1RotateCenterY = p.Y; parameters.Page1TranslateX = -p.X; parameters.Page1TranslateY = p.Y - height; break; case CornerOrigin.BottomRight: parameters.Page1RotateAngle = -num8; parameters.Page1RotateCenterX = p.X; parameters.Page1RotateCenterY = p.Y; parameters.Page1TranslateX = p.X; parameters.Page1TranslateY = p.Y - height; break; } switch (origin) { case CornerOrigin.TopLeft: if (num8 >= 0.0) { parameters.Page1ClippingFigure.StartPoint = new Point(width, height); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(x, height), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width, height - y), false)); break; } parameters.Page1ClippingFigure.StartPoint = new Point(width, 0.0); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(num7, 0.0), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width, height - y), false)); break; case CornerOrigin.TopRight: if (num8 >= 0.0) { parameters.Page1ClippingFigure.StartPoint = new Point(0.0, height); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width - x, height), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0.0, height - y), false)); break; } parameters.Page1ClippingFigure.StartPoint = new Point(0.0, 0.0); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width - num7, 0.0), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0.0, height - y), false)); break; case CornerOrigin.BottomLeft: if (num8 >= 0.0) { parameters.Page1ClippingFigure.StartPoint = new Point(width, 0.0); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(x, 0.0), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width, y), false)); break; } parameters.Page1ClippingFigure.StartPoint = new Point(width, height); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(num7, height), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width, y), false)); break; case CornerOrigin.BottomRight: if (num8 >= 0.0) { parameters.Page1ClippingFigure.StartPoint = new Point(0.0, 0.0); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width - x, 0.0), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0.0, y), false)); break; } parameters.Page1ClippingFigure.StartPoint = new Point(0.0, height); parameters.Page1ClippingFigure.Segments.Clear(); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(width - num7, height), false)); parameters.Page1ClippingFigure.Segments.Add(new LineSegment(new Point(0.0, y), false)); break; } parameters.Page2ClippingFigure.StartPoint = new Point(width - parameters.Page1ClippingFigure.StartPoint.X, parameters.Page1ClippingFigure.StartPoint.Y); parameters.Page2ClippingFigure.Segments = parameters.Page1ClippingFigure.Segments.Clone(); ((LineSegment)parameters.Page2ClippingFigure.Segments[0]).Point = new Point(width - ((LineSegment)parameters.Page2ClippingFigure.Segments[0]).Point.X, ((LineSegment)parameters.Page2ClippingFigure.Segments[0]).Point.Y); ((LineSegment)parameters.Page2ClippingFigure.Segments[1]).Point = new Point(width - ((LineSegment)parameters.Page2ClippingFigure.Segments[1]).Point.X, ((LineSegment)parameters.Page2ClippingFigure.Segments[1]).Point.Y); CornerOrigin topLeft = CornerOrigin.TopLeft; switch (origin) { case CornerOrigin.TopLeft: topLeft = CornerOrigin.TopRight; break; case CornerOrigin.TopRight: topLeft = CornerOrigin.TopLeft; break; case CornerOrigin.BottomLeft: topLeft = CornerOrigin.BottomRight; break; case CornerOrigin.BottomRight: topLeft = CornerOrigin.BottomLeft; break; } NLinearGradientHelper.ComputePointsFromTop(width, height, width - num7, height - y, 20.0, 20.0, topLeft, out point, out point2); parameters.Page1ReflectionStartPoint = point; parameters.Page1ReflectionEndPoint = point2; double num9 = Math.Sqrt(Math.Pow(p.X - width, 2.0) + Math.Pow(p.Y - height, 2.0)); double num10 = num9 / 10.0; double num11 = num9 / 10.0; NLinearGradientHelper.ComputePoints(width, height, width - num7, height - y, num10, num11, origin, out point3, out point4); parameters.Page0ShadowStartPoint = point3; parameters.Page0ShadowEndPoint = point4; return new PageParameters?(parameters); }
public void AutoTurnPage(CornerOrigin fromCorner, int duration) { if (Status != PageStatus.None) return; Status = PageStatus.TurnAnimation; UIElement source = this as UIElement; this.BeginAnimation(BookPage.CornerPointProperty, null); Point startPoint = OriginToPoint(this, fromCorner); Point endPoint = OriginToOppositePoint(this, fromCorner); CornerPoint = startPoint; origin = fromCorner; BezierSegment bs = new BezierSegment(startPoint, new Point(endPoint.X + (startPoint.X - endPoint.X) / 3, 250), endPoint, true); PathGeometry path = new PathGeometry(); PathFigure figure = new PathFigure(); figure.StartPoint = startPoint; figure.Segments.Add(bs); figure.IsClosed = false; path.Figures.Add(figure); PointAnimationUsingPath anim = new PointAnimationUsingPath(); anim.PathGeometry = path; anim.Duration = new Duration(TimeSpan.FromMilliseconds(duration)); anim.AccelerationRatio = 0.6; anim.CurrentTimeInvalidated += new EventHandler(anim_CurrentTimeInvalidated); anim.Completed += new EventHandler(anim_Completed); this.BeginAnimation(BookPage.CornerPointProperty, anim); }
private static double ComputeProgressRatio(UIElement source, Point p, CornerOrigin origin) { if ((origin == CornerOrigin.BottomLeft) || (origin == CornerOrigin.TopLeft)) return p.X / source.RenderSize.Width; else return (source.RenderSize.Width - p.X) / source.RenderSize.Width; }
public static double ComputeProgressRatio(BookPage source, Point p, CornerOrigin origin) { if ((origin != CornerOrigin.BottomLeft) && (origin != CornerOrigin.TopLeft)) { return ((source.RenderSize.Width - p.X) / source.RenderSize.Width); } return (p.X / source.RenderSize.Width); }
private void OnMouseDown(object sender, MouseButtonEventArgs args) { if ((Status == PageStatus.DropAnimation) || (Status == PageStatus.TurnAnimation)) return; UIElement source = sender as UIElement; Point p = args.GetPosition(source); CornerOrigin? tmp = GetCorner(source, p); if (tmp.HasValue) { origin = tmp.Value; this.CaptureMouse(); } else return; Status = PageStatus.Dragging; }
public static PageParameters ResetPage(BookPage source, CornerOrigin origin) { return new PageParameters(source.RenderSize) { Page0ShadowOpacity = 0.0, Page1ClippingFigure = new PathFigure(), Page1ReflectionStartPoint = new Point(0.0, 0.0), Page1ReflectionEndPoint = new Point(0.0, 0.0), Page1RotateAngle = 0.0, Page1RotateCenterX = 0.0, Page1RotateCenterY = 0.0, Page1TranslateX = 0.0, Page1TranslateY = 0.0, Page2ClippingFigure = new PathFigure(), Page0ShadowStartPoint = new Point(0.0, 0.0), Page0ShadowEndPoint = new Point(0.0, 0.0) }; }
private Point OriginToPoint(UIElement source, CornerOrigin origin) { switch (origin) { case CornerOrigin.BottomLeft: return new Point(0, source.RenderSize.Height); case CornerOrigin.BottomRight: return new Point(source.RenderSize.Width, source.RenderSize.Height); case CornerOrigin.TopRight: return new Point(source.RenderSize.Width, 0); default: return new Point(0, 0); } }
protected virtual Point OriginToPoint(CornerOrigin refCornerOrigin) { switch (refCornerOrigin) { case CornerOrigin.TopRight: return new Point(this.RenderSize.Width, 0.0); case CornerOrigin.BottomLeft: return new Point(0.0, this.RenderSize.Height); case CornerOrigin.BottomRight: return new Point(this.RenderSize.Width, this.RenderSize.Height); default: return new Point(0.0, 0.0); } }