private void RenderWave(Graphics g, Channel channel, int triggerPoint, Pen pen, Brush brush, PointF[] points, GraphicsPath path) { // And the initial sample index var leftmostSampleIndex = triggerPoint - channel.ViewWidthInSamples / 2; float xOffset = channel.Bounds.Left; float xScale = (float)channel.Bounds.Width / channel.ViewWidthInSamples; float yOffset = channel.Bounds.Top + channel.Bounds.Height * 0.5f; float yScale = -channel.Bounds.Height * 0.5f; for (int i = 0; i < channel.ViewWidthInSamples; ++i) { var sampleValue = channel.GetSample(leftmostSampleIndex + i, false); points[i].X = xOffset + i * xScale; points[i].Y = yOffset + sampleValue * yScale; } // Then draw them all in one go... if (pen != null) { g.DrawLines(pen, points); } if (brush != null) { // We need to add points to complete the path path.Reset(); path.AddLine(points[0].X, yOffset, points[0].X, points[0].Y); path.AddLines(points); path.AddLine(points[points.Length - 1].X, points[points.Length - 1].Y, points[points.Length - 1].X, yOffset); g.FillPath(brush, path); } }
private void RenderWave(Graphics g, Channel channel, int triggerPoint, Pen pen, Brush brush, PointF[] points, GraphicsPath path, double fillBase) { // And the initial sample index var leftmostSampleIndex = triggerPoint - channel.ViewWidthInSamples / 2; float xOffset = channel.Bounds.Left; float xScale = (float)channel.Bounds.Width / channel.ViewWidthInSamples; float yOffset = channel.Bounds.Top + channel.Bounds.Height * 0.5f; float yScale = -channel.Bounds.Height * 0.5f; for (int i = 0; i < channel.ViewWidthInSamples; ++i) { var sampleValue = channel.GetSample(leftmostSampleIndex + i, false); points[i].X = xOffset + i * xScale; points[i].Y = yOffset + sampleValue * yScale; } if (channel.Clip) { for (int i = 0; i < channel.ViewWidthInSamples; ++i) { points[i].Y = Math.Min(Math.Max(points[i].Y, channel.Bounds.Top), channel.Bounds.Bottom); } } if (channel.SmoothLines) { // Enable anti-aliased lines g.SmoothingMode = SmoothingMode.HighQuality; } else { g.SmoothingMode = SmoothingMode.None; } // Then draw them all in one go... if (pen != null) { // TODO: this is expensive g.DrawLines(pen, points); } if (brush != null) { // We need to add points to complete the path // We compute the Y position of this line. -0.5 scales -1..1 to bottom..top. var baseY = (float)(yOffset + channel.Bounds.Height * -0.5 * fillBase); path.Reset(); path.AddLine(points[0].X, baseY, points[0].X, points[0].Y); path.AddLines(points); path.AddLine(points[points.Length - 1].X, points[points.Length - 1].Y, points[points.Length - 1].X, baseY); g.FillPath(brush, path); } }