예제 #1
0
        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)));
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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]);
            }
        }
예제 #4
0
        private void Render(IControl control)
        {
            var ctx = CreateDrawingContext();

            control.Measure(Size.Infinity);
            control.Arrange(new Rect(control.DesiredSize));
            ImmediateRenderer.Render(control, ctx);
        }
예제 #5
0
 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();
 }
예제 #6
0
 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);
            }
        }
예제 #8
0
        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)));
        }
예제 #10
0
파일: Editor.cs 프로젝트: rmbzlib/mcskin3d
        // =====================================================================
        // 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;
            }
        }
예제 #11
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);
예제 #12
0
 /// <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);
 }