public void AddDirty_With_RenderTransform_Call_RenderRoot_Invalidate() { using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) { var visual = new Mock <Visual>(); var child = new Mock <Visual>() { CallBase = true }; var renderRoot = visual.As <IRenderRoot>(); visual.As <IVisual>().Setup(v => v.Bounds).Returns(new Rect(0, 0, 400, 400)); child.As <IVisual>().Setup(v => v.Bounds).Returns(new Rect(100, 100, 100, 100)); child.As <IVisual>().Setup(v => v.VisualParent).Returns(visual.Object); child.Object.RenderTransform = new ScaleTransform() { ScaleX = 2, ScaleY = 2 }; var target = new ImmediateRenderer(visual.Object); target.AddDirty(child.Object); renderRoot.Verify(v => v.Invalidate(new Rect(50, 50, 200, 200))); } }
public void Should_Track_Bounds() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var control = default(Rectangle); var tree = new Decorator { Padding = new Thickness(10), Child = new Decorator { Padding = new Thickness(5), Child = control = new Rectangle { Width = 15, Height = 15, }, } }; var context = new DrawingContext(Mock.Of <IDrawingContextImpl>()); tree.Measure(Size.Infinity); tree.Arrange(new Rect(0, 0, 100, 100)); ImmediateRenderer.Render(tree, context); var track = control.GetObservable(Visual.TransformedBoundsProperty); var results = new List <TransformedBounds?>(); track.Subscribe(results.Add); Assert.Equal(new Rect(0, 0, 15, 15), results[0].Value.Bounds); Assert.Equal(Matrix.CreateTranslation(42, 42), results[0].Value.Transform); } }
public void AddDirty_For_Child_Moved_Should_Invalidate_Previous_Bounds() { using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) { var visual = new Mock <Visual>() { CallBase = true }; var child = new Mock <Visual>() { CallBase = true }; var renderRoot = visual.As <IRenderRoot>(); var renderTarget = visual.As <IRenderTarget>(); renderRoot.Setup(r => r.CreateRenderTarget()).Returns(renderTarget.Object); renderTarget.Setup(r => r.CreateDrawingContext(It.IsAny <IVisualBrushRenderer>())) .Returns(Mock.Of <IDrawingContextImpl>()); visual.As <IVisual>().Setup(v => v.Bounds).Returns(new Rect(0, 0, 400, 400)); visual.As <IVisual>().Setup(v => v.VisualChildren) .Returns(new AvaloniaList <IVisual>() { child.As <IVisual>().Object }); Rect childBounds = new Rect(0, 0, 100, 100); child.As <IVisual>().Setup(v => v.Bounds).Returns(() => childBounds); child.As <IVisual>().Setup(v => v.VisualParent).Returns(visual.Object); child.As <IVisual>().Setup(v => v.VisualChildren).Returns(new AvaloniaList <IVisual>()); var invalidationCalls = new List <Rect>(); renderRoot.Setup(v => v.Invalidate(It.IsAny <Rect>())).Callback <Rect>(v => invalidationCalls.Add(v)); var target = new ImmediateRenderer(visual.Object); target.AddDirty(child.Object); Assert.Equal(new Rect(0, 0, 100, 100), invalidationCalls[0]); target.Paint(new Rect(0, 0, 100, 100)); //move child 100 pixels bottom/right childBounds = new Rect(100, 100, 100, 100); //renderer should invalidate old child bounds with new one //as on old area there can be artifacts target.AddDirty(child.Object); //invalidate first old position Assert.Equal(new Rect(0, 0, 100, 100), invalidationCalls[1]); //then new position Assert.Equal(new Rect(100, 100, 100, 100), invalidationCalls[2]); } }
private void Render(IControl control) { var ctx = CreateDrawingContext(); control.Measure(Size.Infinity); control.Arrange(new Rect(control.DesiredSize)); ImmediateRenderer.Render(control, ctx); }
public static void ToFile(string fileName, IEnumerable <IVisual> visuals) { using var doc = SKDocument.CreatePdf(fileName); foreach (var visual in visuals) { var bounds = visual.Bounds; var page = doc.BeginPage((float)bounds.Width, (float)bounds.Height); var renderTarget = SkiaRenderTarget.Create(page); ImmediateRenderer.Render(visual, renderTarget); doc.EndPage(); } doc.Close(); }
public static void ToFile(string fileName, IEnumerable <IVisual> visuals) { using var doc = SKDocument.CreatePdf(fileName); foreach (var visual in visuals) { var bounds = visual.Bounds; var page = doc.BeginPage((float)bounds.Width, (float)bounds.Height); using var context = new DrawingContext(DrawingContextHelper.WrapSkiaCanvas(page, SkiaPlatform.DefaultDpi)); ImmediateRenderer.Render(visual, context); doc.EndPage(); } doc.Close(); }
public void Static_Render_Method_Does_Not_Update_TransformedBounds() { using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) { var target = new Border(); var expected = new TransformedBounds(new Rect(1, 2, 3, 4), new Rect(4, 5, 6, 7), Matrix.CreateRotation(0.8)); ((IVisual)target).TransformedBounds = expected; var renderTarget = Mock.Of <IRenderTarget>(x => x.CreateDrawingContext(It.IsAny <IVisualBrushRenderer>()) == Mock.Of <IDrawingContextImpl>()); ImmediateRenderer.Render(target, renderTarget); Assert.Equal(expected, target.TransformedBounds); } }
public static void Render(Control target, SKCanvas canvas, double dpi = 96, bool useDeferredRenderer = false) { var renderTarget = new CanvasRenderTarget(canvas, dpi); if (useDeferredRenderer) { using var renderer = new DeferredRenderer(target, renderTarget); renderer.Start(); var renderLoopTask = renderer as IRenderLoopTask; renderLoopTask.Update(TimeSpan.Zero); renderLoopTask.Render(); } else { ImmediateRenderer.Render(target, renderTarget); } }
public void AddDirty_Call_RenderRoot_Invalidate() { var visual = new Mock <Visual>(); var child = new Mock <Visual>() { CallBase = true }; var renderRoot = visual.As <IRenderRoot>(); visual.As <IVisual>().Setup(v => v.Bounds).Returns(new Rect(0, 0, 400, 400)); child.As <IVisual>().Setup(v => v.Bounds).Returns(new Rect(10, 10, 100, 100)); child.As <IVisual>().Setup(v => v.VisualParent).Returns(visual.Object); var target = new ImmediateRenderer(visual.Object); target.AddDirty(child.Object); renderRoot.Verify(v => v.Invalidate(new Rect(10, 10, 100, 100))); }
// ===================================================================== // Updating // ===================================================================== // ===================================================================== // Shortcuts // ===================================================================== // ===================================================================== // Overrides // ===================================================================== // ===================================================================== // Private functions // ===================================================================== private void InitGL() { GL.ClearColor(GlobalSettings.BackgroundColor); GL.Enable(EnableCap.Texture2D); GL.ShadeModel(ShadingModel.Smooth); // Enable Smooth Shading GL.Enable(EnableCap.DepthTest); // Enables Depth Testing GL.DepthFunc(DepthFunction.Lequal); // The Type Of Depth Testing To Do GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest); // Really Nice Perspective Calculations GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode, (int)TextureEnvMode.Modulate); _toolboxUpNormal = new TextureGL(Resources.buttong); _toolboxUpHover = new TextureGL(Resources.buttong_2); _toolboxDownNormal = new TextureGL(Resources.buttong_down); _toolboxDownHover = new TextureGL(Resources.buttong_down2); _cubeSides = new TextureGL(Resources.cube_sides); _cubeSides.SetMipmapping(true); _cubeSides.SetRepeat(true); _font = new TextureGL(Resources.tinyfont); _font.SetMipmapping(false); _font.SetRepeat(false); _grassTop = new TextureGL(GlobalSettings.GetDataURI("grass.png")); _grassTop.SetMipmapping(false); _grassTop.SetRepeat(true); _dynamicOverlay = new BackgroundImage("Dynamic", "Dynamic", null); _dynamicOverlay.Item = mDYNAMICOVERLAYToolStripMenuItem; _backgrounds.Add(_dynamicOverlay); foreach (string file in Directory.GetFiles(GlobalSettings.GetDataURI("Overlays"), "*.png")) { try { var image = new TextureGL(file); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Clamp); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Clamp); _backgrounds.Add(new BackgroundImage(file, Path.GetFileNameWithoutExtension(file), image)); } catch { MessageBox.Show(this, string.Format(GetLanguageString("B_MSG_OVERLAYERROR"), file)); } } int index = 0; foreach (BackgroundImage b in _backgrounds) { ToolStripMenuItem item = b.Item ?? new ToolStripMenuItem(b.Name); b.Item = item; if (b.Path == GlobalSettings.LastBackground) { item.Checked = true; _selectedBackground = index; } item.Click += item_Clicked; item.Tag = index++; if (!backgroundsToolStripMenuItem.DropDownItems.Contains(item)) backgroundsToolStripMenuItem.DropDownItems.Add(item); } _previewPaint = new TextureGL(); GlobalDirtiness.CurrentSkin = new TextureGL(); _alphaTex = new TextureGL(); var arra = new byte[64 * 32]; _previewPaint.Upload(arra, 64, 32); _previewPaint.SetMipmapping(false); _previewPaint.SetRepeat(false); GlobalDirtiness.CurrentSkin.Upload(arra, 64, 32); GlobalDirtiness.CurrentSkin.SetMipmapping(false); GlobalDirtiness.CurrentSkin.SetRepeat(false); arra = new byte[] { 127, 127, 127, 255, 80, 80, 80, 255, 80, 80, 80, 255, 127, 127, 127, 255 }; _alphaTex.Upload(arra, 2, 2); _alphaTex.SetMipmapping(false); _alphaTex.SetRepeat(true); bool supportsArrays = GL.GetString(StringName.Extensions).Contains("GL_EXT_vertex_array"); bool forceImmediate = GlobalSettings.RenderMode == 0; clientArraysToolStripMenuItem.Enabled = supportsArrays; if (supportsArrays && !forceImmediate) { MeshRenderer = new ClientArrayRenderer(); clientArraysToolStripMenuItem.Checked = true; GlobalSettings.RenderMode = 1; } else { MeshRenderer = new ImmediateRenderer(); immediateToolStripMenuItem.Checked = true; GlobalSettings.RenderMode = 0; } }
/// <summary> /// Renders a visual to the <see cref="RenderTargetBitmap"/>. /// </summary> /// <param name="visual">The visual to render.</param> public void Render(IVisual visual) => ImmediateRenderer.Render(visual, this);
/// <summary> /// Initializes a new instance of the <see cref="X11ImmediateRendererProxy"/> class. /// </summary> /// <param name="root">The root.</param> /// <param name="loop">The loop.</param> public X11ImmediateRendererProxy(IVisual root, IRenderLoop loop) { _loop = loop; _renderer = new ImmediateRenderer(root); }