void ScalePartAndFixPosition(MouseEventArgs mouseEvent, double scaleAmount) { Vector2 mousePreScale = new Vector2(mouseEvent.X, mouseEvent.Y); TotalTransform.inverse_transform(ref mousePreScale); layerScale = scaleAmount; Vector2 mousePostScale = new Vector2(mouseEvent.X, mouseEvent.Y); TotalTransform.inverse_transform(ref mousePostScale); unscaledRenderOffset += (mousePostScale - mousePreScale); }
public override void OnMouseMove(MouseEventArgs mouseEvent) { base.OnMouseMove(mouseEvent); Vector2 mousePos = new Vector2(mouseEvent.X, mouseEvent.Y); if (MouseCaptured) { Vector2 mouseDelta = mousePos - lastMousePosition; switch (TransformState) { case ETransformState.Move: ScallingTransform.inverse_transform(ref mouseDelta); unscaledRenderOffset += mouseDelta; break; case ETransformState.Scale: double zoomDelta = 1; if (mouseDelta.y < 0) { zoomDelta = 1 - (-1 * mouseDelta.y / 100); } else if (mouseDelta.y > 0) { zoomDelta = 1 + (1 * mouseDelta.y / 100); } Vector2 mousePreScale = mouseDownPosition; TotalTransform.inverse_transform(ref mousePreScale); layerScale *= zoomDelta; Vector2 mousePostScale = mouseDownPosition; TotalTransform.inverse_transform(ref mousePostScale); unscaledRenderOffset += (mousePostScale - mousePreScale); break; default: throw new NotImplementedException(); } Invalidate(); } lastMousePosition = mousePos; }
public override void OnMouseWheel(MouseEventArgs mouseEvent) { base.OnMouseWheel(mouseEvent); if (FirstWidgetUnderMouse) // TODO: find a good way to decide if you are what the wheel is trying to do { Vector2 mousePreScale = new Vector2(mouseEvent.X, mouseEvent.Y); TotalTransform.inverse_transform(ref mousePreScale); const double deltaFor1Click = 120; layerScale = layerScale + layerScale * (mouseEvent.WheelDelta / deltaFor1Click) * .1; Vector2 mousePostScale = new Vector2(mouseEvent.X, mouseEvent.Y); TotalTransform.inverse_transform(ref mousePostScale); unscaledRenderOffset += (mousePostScale - mousePreScale); Invalidate(); } }
public override void PostProcess(SKRect?viewport, SKMatrix totalMatrix) { var element = Element; if (element is null) { return; } var enableOpacity = !IgnoreAttributes.HasFlag(DrawAttributes.Opacity); ClipPath = null; MaskDrawable = null; Opacity = enableOpacity ? SvgExtensions.GetOpacityPaint(element) : null; Filter = null; TotalTransform = totalMatrix.PreConcat(Transform); TransformedBounds = TotalTransform.MapRect(GeometryBounds); foreach (var child in ChildrenDrawables) { child.PostProcess(viewport, totalMatrix); } }
public override void OnMouseMove(MouseEventArgs mouseEvent) { base.OnMouseMove(mouseEvent); Vector2 mousePos = new Vector2(); if (mouseEvent.NumPositions == 1) { mousePos = new Vector2(mouseEvent.X, mouseEvent.Y); } else { Vector2 centerPosition = (mouseEvent.GetPosition(1) + mouseEvent.GetPosition(0)) / 2; mousePos = centerPosition; } if (MouseCaptured) { Vector2 mouseDelta = mousePos - lastMousePosition; switch (TransformState) { case ETransformState.Move: ScalingTransform.inverse_transform(ref mouseDelta); unscaledRenderOffset += mouseDelta; break; case ETransformState.Scale: double zoomDelta = 1; if (mouseDelta.y < 0) { zoomDelta = 1 - (-1 * mouseDelta.y / 100); } else if (mouseDelta.y > 0) { zoomDelta = 1 + (1 * mouseDelta.y / 100); } Vector2 mousePreScale = mouseDownPosition; TotalTransform.inverse_transform(ref mousePreScale); layerScale *= zoomDelta; Vector2 mousePostScale = mouseDownPosition; TotalTransform.inverse_transform(ref mousePostScale); unscaledRenderOffset += (mousePostScale - mousePreScale); break; default: throw new NotImplementedException(); } Invalidate(); } lastMousePosition = mousePos; // check if we should do some scaling if (TransformState == ETransformState.Move && mouseEvent.NumPositions > 1 && startDistanceBetweenPoints > 0) { double curDistanceBetweenPoints = (mouseEvent.GetPosition(1) - mouseEvent.GetPosition(0)).Length; double scaleAmount = pinchStartScale * curDistanceBetweenPoints / startDistanceBetweenPoints; ScalePartAndFixPosition(mouseEvent, scaleAmount); } }