Skip to content

Commit f6fd13a

Browse files
Standardizing on precision
1 parent 0819d5d commit f6fd13a

File tree

1 file changed

+21
-23
lines changed

1 file changed

+21
-23
lines changed

Sources/Microcharts.Forms/ChartView.cs

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ private void OnPaintCanvas(object sender, SKPaintSurfaceEventArgs e)
9292
}
9393

9494

95-
double zoomCurScale = 1;
96-
double zoomStartScale = 1;
95+
float zoomCurScale = 1;
96+
float zoomStartScale = 1;
9797

9898
SKPoint zoomStartOrigin = new SKPoint(0, 0);
9999
SKPoint zoomStartOffset = new SKPoint(0, 0);
@@ -115,45 +115,43 @@ void OnPinchUpdated(object sender, PinchGestureUpdatedEventArgs e)
115115

116116
if (e.Status == GestureStatus.Running)
117117
{
118+
float eScale = (float)e.Scale;
119+
SKPoint eScaleOrigin = new SKPoint((float)e.ScaleOrigin.X, (float)e.ScaleOrigin.Y);
120+
SKPoint canvasSize = new SKPoint(CanvasSize.Width, CanvasSize.Height);
121+
118122
// e.Scale is the delta to be applied for the current frame
119123
// Calculate the scale factor to be applied.
120-
zoomCurScale += (e.Scale - 1) * zoomStartScale;
124+
zoomCurScale += (eScale - 1) * zoomStartScale;
121125
zoomCurScale = Math.Max(1, zoomCurScale);
122126
zoomCurScale = Math.Min(5, zoomCurScale);
123127

124-
125-
SKPoint zoomPanDelta = new SKPoint((float)((e.ScaleOrigin.X - zoomStartOrigin.X) * CanvasSize.Width), (float)((e.ScaleOrigin.Y - zoomStartOrigin.Y) * CanvasSize.Height));
128+
SKPoint zoomPanDelta = new SKPoint((eScaleOrigin.X - zoomStartOrigin.X) * CanvasSize.Width, (eScaleOrigin.Y - zoomStartOrigin.Y) * CanvasSize.Height);
126129

127130
// The ScaleOrigin is in relative coordinates to the wrapped user interface element,
128131
// so get the X pixel coordinate.
129-
double renderedX = X + zoomStartOffset.X;
130-
double deltaX = renderedX / CanvasSize.Width;
131-
double deltaWidth = CanvasSize.Width / (CanvasSize.Width * zoomStartScale);
132-
double originX = (e.ScaleOrigin.X - deltaX) * deltaWidth;
132+
float renderedX = (float)X + zoomStartOffset.X;
133+
float deltaX = renderedX / CanvasSize.Width;
134+
float deltaWidth = CanvasSize.Width / (CanvasSize.Width * zoomStartScale);
135+
float originX = (eScaleOrigin.X - deltaX) * deltaWidth;
133136

134137
//Console.WriteLine("ScaleOrigin: {0}, {1}", e.ScaleOrigin.X, e.ScaleOrigin.Y);
135138

136139
// The ScaleOrigin is in relative coordinates to the wrapped user interface element,
137140
// so get the Y pixel coordinate.
138-
double renderedY = Y + zoomStartOffset.Y;
139-
double deltaY = renderedY / CanvasSize.Height;
140-
double deltaHeight = CanvasSize.Height / (CanvasSize.Height * zoomStartScale);
141-
double originY = (e.ScaleOrigin.Y - deltaY) * deltaHeight;
141+
float renderedY = (float)Y + zoomStartOffset.Y;
142+
float deltaY = renderedY / CanvasSize.Height;
143+
float deltaHeight = CanvasSize.Height / (CanvasSize.Height * zoomStartScale);
144+
float originY = (eScaleOrigin.Y - deltaY) * deltaHeight;
142145

143146
// Calculate the transformed element pixel coordinates.
144-
double targetX = zoomStartOffset.X - (originX * CanvasSize.Width) * (zoomCurScale - zoomStartScale);
145-
double targetY = zoomStartOffset.Y - (originY * CanvasSize.Height) * (zoomCurScale - zoomStartScale);
146-
147-
// Apply translation based on the change in origin.
148-
zoomTranslation.X = (float)targetX;
149-
zoomTranslation.Y = (float)targetY;
150-
147+
zoomTranslation.X = zoomStartOffset.X - (originX * CanvasSize.Width) * (zoomCurScale - zoomStartScale);
148+
zoomTranslation.Y = zoomStartOffset.Y - (originY * CanvasSize.Height) * (zoomCurScale - zoomStartScale);
151149

150+
// Calculate final translation with pan, and clamp the whole thing
152151
SKPoint final = zoomTranslation + zoomPanDelta;
153-
final.X = Math.Min(Math.Max(final.X, -CanvasSize.Width * (float)(zoomCurScale - 1)), 0);
154-
final.Y = Math.Min(Math.Max(final.Y, -CanvasSize.Height * (float)(zoomCurScale - 1)), 0);
152+
final.X = Math.Min(Math.Max(final.X, -CanvasSize.Width * (zoomCurScale - 1)), 0);
153+
final.Y = Math.Min(Math.Max(final.Y, -CanvasSize.Height * (zoomCurScale - 1)), 0);
155154

156-
157155
axisChart.XForm.Scale = (float)zoomCurScale;
158156
axisChart.XForm.Offset = final;
159157
InvalidateSurface();

0 commit comments

Comments
 (0)