protected sealed override void OnPaint(PaintEventArgs e) { if (EnableDoubleBuffering) { var screen = ParentWindow.Screen; var scale = screen.RealScale / screen.Scale; renderSize = Size.Round(e.ClipRectangle.Size * scale); if (bitmap == null || bitmap.Size.Width < renderSize.Width || bitmap.Size.Height < renderSize.Height) { if (bitmap != null) bitmap.Dispose(); bitmap = new Bitmap(renderSize, PixelFormat.Format32bppRgba); } var bitmapGraphics = new Graphics(bitmap); bitmapGraphics.Clear(Brushes.Cached(BackgroundColor)); bitmapGraphics.ScaleTransform(scale); bitmapGraphics.TranslateTransform(-e.ClipRectangle.Location); bitmapGraphics.SetClip(e.ClipRectangle * scale); // should be affected by transform var childArgs = new PaintEventArgs(bitmapGraphics, e.ClipRectangle); base.OnPaint(childArgs); OnBufferedPaint(childArgs); bitmapGraphics.Dispose(); bitmapGraphics = null; e.Graphics.DrawImage(bitmap, new RectangleF(renderSize), e.ClipRectangle); if (Platform.IsWpf) { // wpf runs out of resources fast here, so we garbage collect GC.Collect(); } } else { base.OnPaint(e); OnBufferedPaint(e); } }
void DirectTests(Graphics g) { // test translate/rotate DrawRotatedLines(g, Colors.SkyBlue, rotatedLineCenter, (center, angle) => { g.TranslateTransform(center); g.RotateTransform(angle); g.TranslateTransform(-center); }); // test translate/rotate/scale DrawRotatedLines(g, Colors.Salmon, rotatedLineCenter, (center, angle) => { g.TranslateTransform(center); g.RotateTransform(angle); g.TranslateTransform(-center); g.ScaleTransform(.4f); }); // test rotating arcs DrawRotatedArcs(g, Colors.LightBlue, rotatedLineCenter, (center, angle) => { g.TranslateTransform(center); g.RotateTransform(angle); g.TranslateTransform(-center); }); // test transformed text DrawRotatedText(g, Colors.Lime, rotatedTextCenter, (center, angle) => { g.TranslateTransform(center - 40); g.RotateTransform(angle); g.TranslateTransform(-center + 40); }); // Test image drawing g.SaveTransform(); g.TranslateTransform(imageScaleLocation + image.Size / 2); g.ScaleTransform(1, -1); g.TranslateTransform(-imageScaleLocation - image.Size / 2); g.DrawImage(image, imageScaleLocation); g.TranslateTransform(0, -50); g.TranslateTransform(imageScaleLocation + image.Size / 2); g.ScaleTransform(0.3f); g.TranslateTransform(-imageScaleLocation - image.Size / 2); g.DrawImage(image, imageScaleLocation); g.RestoreTransform(); // test skewing g.SaveTransform(); g.MultiplyTransform(Matrix.FromSkew(20, 20)); var textSize = g.MeasureString(font, "Skewed Text"); g.DrawText(font, Colors.White, new PointF(110, 0), "Skewed Text"); g.DrawLine(Pens.White, 110, textSize.Height + 2, 110 + textSize.Width, textSize.Height + 2); g.RestoreTransform(); // test more drawing operations g.SaveTransform(); g.TranslateTransform(480, 20); g.ScaleTransform(0.4f); g.RotateTransform(90); PixelOffsetSection.Draw(g); g.RestoreTransform(); }
/// <summary> /// /// </summary> /// <param name="g"></param> private void Draw(Graphics g) { g.AntiAlias = false; g.PixelOffsetMode = PixelOffsetMode.Half; g.TranslateTransform(_state.PanX, _state.PanY); g.ScaleTransform(_state.Zoom); var brush = new SolidBrush(_background); g.Clear(brush); brush.Dispose(); var renderer = _context.Editor.Renderers[0]; if (_context.Editor.Project == null) return; var container = _context.Editor.Project.CurrentContainer; if (container.Template != null) { DrawBackground( g, container.Template.Background, container.Width, container.Height); renderer.Draw( g, container.Template, container.Properties, null); } DrawBackground( g, container.Background, container.Width, container.Height); renderer.Draw( g, container, container.Properties, null); if (container.WorkingLayer != null) { renderer.Draw( g, container.WorkingLayer, container.Properties, null); } if (container.HelperLayer != null) { renderer.Draw( g, container.HelperLayer, container.Properties, null); } }
Control DrawImageToRect() { var image64 = TestIcons.Textures; var size = new Size(105, 105) * (int)Screen.PrimaryScreen.LogicalPixelSize; var bitmap = new Bitmap(size, PixelFormat.Format32bppRgba); using (var g = new Graphics(bitmap)) { g.PixelOffsetMode = PixelOffsetMode.Half; g.ScaleTransform(Screen.PrimaryScreen.LogicalPixelSize, Screen.PrimaryScreen.LogicalPixelSize); // Draw the "5" portion of the texture at a smaller size at the origin. g.DrawImage(image64, new RectangleF(80, 80, 80, 80), new RectangleF(0, 0, 32, 32)); // draw two rulers to indicate how big the green image should be g.SaveTransform(); g.MultiplyTransform(Matrix.Create(1, 0, 0, 1, 0.5f, 70.5f)); DrawRuler(32, g, Colors.Blue); g.RestoreTransform(); g.SaveTransform(); g.MultiplyTransform(Matrix.Create(0, 1, 1, 0, 70.5f, 0.5f)); DrawRuler(32, g, Colors.Blue); g.RestoreTransform(); } return new DrawableImageView { Image = new Icon(Screen.PrimaryScreen.LogicalPixelSize, bitmap) }; }