Example #1
0
 public void AddScreen(Control screen)
 {
     // works
     //GameLog.Client.GameData.DebugFormat("GameScreenStack.cs: screen={0}", screen);
     if (screen == null)
     {
         throw new ArgumentNullException("screen");
     }
     lock (_screens)
     {
         if (_screens.Contains(screen))
         {
             return;
         }
         var wasEmpty = (_screens.Count == 0);
         _screens.Add(screen);
         _itemsContainer.Children.Add(screen);
         if (IsVisible)
         {
             screen.Measure(RenderSize);
             screen.Arrange(new Rect(RenderSize));
         }
         screen.Visibility = Visibility.Hidden;
         if (wasEmpty)
         {
             FallbackScreen = screen;
         }
     }
 }
        private static PngBitmapEncoder getImageFromControl(Control controlToConvert)
        {
            // save current canvas transform

            Transform transform = controlToConvert.LayoutTransform;
            // get size of control
            Size sizeOfControl = new Size(120, 120);//controlToConvert.ActualWidth, controlToConvert.ActualHeight);

            // measure and arrange the control
            controlToConvert.Measure(sizeOfControl);
            // arrange the surface
            controlToConvert.Arrange(new Rect(sizeOfControl));
            // craete and render surface and push bitmap to it
            RenderTargetBitmap renderBitmap = new RenderTargetBitmap((Int32)sizeOfControl.Width, (Int32)sizeOfControl.Height, 96d, 96d, PixelFormats.Pbgra32);

            // now render surface to bitmap
            renderBitmap.Render(controlToConvert);
            // encode png data
            PngBitmapEncoder pngEncoder = new PngBitmapEncoder();

            // puch rendered bitmap into it
            pngEncoder.Frames.Add(BitmapFrame.Create(renderBitmap));
            // return encoder
            return(pngEncoder);
        }
        protected override Avalonia.Size ArrangeOverride(Avalonia.Size finalSize)
        {
            if (Element == null)
            {
                return(finalSize);
            }

            Element.IsInNativeLayout = true;

            for (var i = 0; i < ElementController.LogicalChildren.Count; i++)
            {
                var child = ElementController.LogicalChildren[i] as VisualElement;
                if (child == null)
                {
                    continue;
                }

                IVisualElementRenderer renderer = Platform.GetRenderer(child);
                if (renderer == null)
                {
                    continue;
                }

                Rectangle bounds     = child.Bounds;
                Control   control    = renderer.GetNativeElement();
                Rect      childFinal = new Rect(bounds.X, bounds.Y, Math.Max(0, bounds.Width), Math.Max(0, bounds.Height));
                control.Arrange(childFinal);
            }

            Element.IsInNativeLayout = false;

            return(finalSize);
        }
        protected override Size ArrangeOverride(Size finalSize)
        {
            var  c = _child as IControlAdornerChild;
            Rect rect;

            if (Offset.X != 0 || Offset.Y != 0)
            {
                rect = new Rect(
                    ChildPosition.X + Offset.X,
                    ChildPosition.Y + Offset.Y,
                    finalSize.Width,
                    finalSize.Height);
            }
            else if (c != null)
            {
                ChildPosition = c.GetPosition();
                rect          = new Rect(ChildPosition.X, ChildPosition.Y, finalSize.Width, finalSize.Height);
            }
            else
            {
                rect = new Rect(_offset.X, _offset.Y, finalSize.Width, finalSize.Height);
            }

            _child.Arrange(rect);

            return(new Size(_child.ActualWidth, _child.ActualHeight));
        }
        protected override Size ArrangeOverride(Size size)
        {
            Size finalSize = base.ArrangeOverride(size);

            adornerHost?.Arrange(new Rect(new Point(), finalSize));
            return(finalSize);
        }
Example #6
0
        protected override Size ArrangeOverride(Size finalSize)
        {
            double      curY  = 0;
            List <Step> steps = new List <Step>();

            for (int i = 0; i < Children.Count; i++)
            {
                Control child = (Control)Children[i];

                //child.VerticalContentAlignment = i == 0 ? VerticalAlignment.Top :
                //    i == Children.Count - 1 ? VerticalAlignment.Bottom : VerticalAlignment.Center;

                Rect allocatedRect = new Rect(0, curY, finalSize.Width, child.DesiredSize.Height);
                child.Arrange(allocatedRect);

                double midPoint = i == 0 ?
                                  finalSize.Height :
                                  finalSize.Height - ((allocatedRect.Top + allocatedRect.Bottom) / 2.0d);
                //double midPoint = finalSize.Height - ((curY + item.HeaderHeight) / 2.0d);
                if (child is ToolbarSubItemEx)
                {
                    ToolbarSubItemEx item = (ToolbarSubItemEx)child;
                    double           value;
                    if (!item.IsSeparator && item.Value != null && double.TryParse(item.Value.ToString(), out value))
                    {
                        steps.Add(new Step(midPoint, value, item.IsStepStop));
                    }
                }
                curY += child.DesiredSize.Height;
            }

            Steps = new ObservableCollection <Step>(steps.OrderBy <Step, double>(x => x.Posision));
            return(finalSize);
        }
Example #7
0
        //TODO: We need to revisit this later when we complete the UI Tests for UWP.
        // Changing the AutomationPeer here prevents the Narrator from functioning properly.
        // Oddly, it affects more than just the TextBlocks. It seems to break the entire scan mode.

        //protected override AutomationPeer OnCreateAutomationPeer()
        //{
        //	// We need an automation peer so we can interact with this in automated tests
        //	if (Control == null)
        //	{
        //		return new FrameworkElementAutomationPeer(this);
        //	}

        //	return new TextBlockAutomationPeer(Control);
        //}

        protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize)
        {
            if (Element == null)
            {
                return(finalSize);
            }

            double childHeight = Math.Max(0, Math.Min(Element.Height, Control.DesiredSize.Height));
            var    rect        = new Rect();

            switch (Element.VerticalTextAlignment)
            {
            case TextAlignment.Start:
                break;

            default:
            case TextAlignment.Center:
                rect.Y = (int)((finalSize.Height - childHeight) / 2);
                break;

            case TextAlignment.End:
                rect.Y = finalSize.Height - childHeight;
                break;
            }
            rect.Height = childHeight;
            rect.Width  = finalSize.Width;

            Control.Arrange(rect);
            Control.RecalculateSpanPositions(Element, _inlineHeights);
            return(finalSize);
        }
Example #8
0
        public static void ScreenCapture(Control control, string filename)
        {
            try
            {
                // The BitmapSource that is rendered with a Visual.
                control.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                Size size   = control.DesiredSize;
                int  width  = (int)size.Width;
                int  height = (int)size.Height;
                control.Arrange(new Rect(0, 0, width, height));
                var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
                rtb.Render(control);

                // Encoding the RenderBitmapTarget as a PNG file.
                var png = new PngBitmapEncoder();
                png.Frames.Add(BitmapFrame.Create(rtb));
                using (Stream stm = File.Create(filename))
                {
                    png.Save(stm);
                }
            }
            finally
            {
            }
        }
Example #9
0
        protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize)
        {
            if (Element == null || finalSize.Width * finalSize.Height == 0)
            {
                return(finalSize);
            }

            Element.IsInNativeLayout = true;

            if (Control != null)
            {
                Control.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height));
            }

            for (var i = 0; i < ElementController.LogicalChildren.Count; i++)
            {
                var child = ElementController.LogicalChildren[i] as VisualElement;
                if (child == null)
                {
                    continue;
                }
                IVisualElementRenderer renderer = Platform.GetRenderer(child);
                if (renderer == null)
                {
                    continue;
                }
                Rectangle bounds = child.Bounds;

                renderer.ContainerElement.Arrange(new Rect(bounds.X, bounds.Y, Math.Max(0, bounds.Width), Math.Max(0, bounds.Height)));
            }

            Element.IsInNativeLayout = false;

            return(finalSize);
        }
Example #10
0
 public static void Render(Control target, Size size, Stream stream, double dpi = 72, bool useDeferredRenderer = false)
 {
     using var managedWStream = new SKManagedWStream(stream);
     using var document       = SKDocument.CreateXps(stream, (float)dpi);
     using var canvas         = document.BeginPage((float)size.Width, (float)size.Height);
     target.Measure(size);
     target.Arrange(new Rect(size));
     CanvasRenderer.Render(target, canvas, dpi, useDeferredRenderer);
 }
Example #11
0
        /// <summary>
        /// Arranges the specified final size.
        /// </summary>
        /// <param name="finalSize">The final size.</param>
        public override void Arrange(RectangleF finalSize)
        {
            base.Arrange(finalSize);

            Vector2 line  = Vector2.Zero;
            float   accum = 0;

            foreach (Entity entity in this.Owner.ChildEntities)
            {
                Control control = entity.FindComponent <Control>(false);

                if (control != null)
                {
                    float x;
                    float y;

                    if (this.Orientation == Orientation.Horizontal)
                    {
                        // if new Line
                        if (line.X + control.DesiredSize.X > this.Transform2D.Rectangle.Width)
                        {
                            line.X = 0;
                            accum += line.Y;
                            line.Y = 0;
                        }

                        x       = this.Transform2D.Rectangle.X + line.X;
                        line.X += control.DesiredSize.X;
                        line.Y  = MathHelper.Max(line.Y, control.DesiredSize.Y);
                        y       = this.Transform2D.Rectangle.Y + accum;
                    }
                    else
                    {
                        // if new Line
                        if (line.Y + control.DesiredSize.Y > this.Transform2D.Rectangle.Height)
                        {
                            line.Y = 0;
                            accum += line.X;
                            line.X = 0;
                        }

                        y       = this.Transform2D.Rectangle.Y + line.Y;
                        line.Y += control.DesiredSize.Y;
                        line.X  = MathHelper.Max(line.X, control.DesiredSize.X);
                        x       = this.Transform2D.Rectangle.X + accum;
                    }

                    RectangleF childRect = new RectangleF(
                        x,
                        y,
                        control.DesiredSize.X,
                        control.DesiredSize.Y);

                    control.Arrange(childRect);
                }
            }
        }
Example #12
0
    public static void Render(Control target, Size size, Stream stream, double dpi = 96, bool useDeferredRenderer = false)
    {
        using var managedWStream = new SKManagedWStream(stream);
        var bounds = SKRect.Create(new SKSize((float)size.Width, (float)size.Height));

        using var canvas = SKSvgCanvas.Create(bounds, managedWStream);
        target.Measure(size);
        target.Arrange(new Rect(size));
        CanvasRenderer.Render(target, canvas, dpi, useDeferredRenderer);
    }
Example #13
0
        protected override Size ArrangeOverride(Size finalSize)
        {
            var location  = new Point(finalSize.Width - _child.DesiredSize.Width, 0);
            var finalRect = new Rect(location, _child.DesiredSize);

            _child.Arrange(finalRect);
            Trace.WriteLine("Measure - " + finalRect);

            return(finalSize);
        }
Example #14
0
 protected override Size ArrangeOverride(Size finalSize)
 {
     LastArrangeOverrideArgument = finalSize;
     LastArrangeOverrideResult   = base.ArrangeOverride(finalSize);
     if (null != Content)
     {
         Content.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height));
     }
     return(LastArrangeOverrideResult.Value);
 }
Example #15
0
        protected override global::Windows.Foundation.Size ArrangeOverride(global::Windows.Foundation.Size finalSize)
        {
            Control.Arrange(new WRect(0, 0, finalSize.Width, finalSize.Height));
            if (Element is IContentView cv)
            {
                cv.CrossPlatformArrange(new Rect(0, 0, finalSize.Width, finalSize.Height));
            }

            return(finalSize);
        }
Example #16
0
        /// <summary>
        /// Arranges the specified final size.
        /// </summary>
        /// <param name="finalSize">The final size.</param>
        public override void Arrange(RectangleF finalSize)
        {
            base.Arrange(finalSize);

            float accum;

            if (Orientation == Orientation.Vertical)
            {
                accum = Transform2D.Rectangle.Y;
            }
            else
            {
                accum = Transform2D.Rectangle.X;
            }

            foreach (Entity entity in Owner.ChildEntities)
            {
                Control control = entity.FindComponent <Control>(false);

                if (control != null)
                {
                    float x;
                    float y;

                    RectangleF childRect;

                    if (Orientation == Orientation.Vertical)
                    {
                        x      = Transform2D.Rectangle.X;
                        y      = accum;
                        accum += control.DesiredSize.Y;

                        childRect = new RectangleF(
                            x,
                            y,
                            Transform2D.Rectangle.Width,
                            control.DesiredSize.Y);
                    }
                    else
                    {
                        x      = accum;
                        y      = Transform2D.Rectangle.Y;
                        accum += control.DesiredSize.X;

                        childRect = new RectangleF(
                            x,
                            y,
                            control.DesiredSize.X,
                            Transform2D.Rectangle.Height);
                    }

                    control.Arrange(childRect);
                }
            }
        }
Example #17
0
    public static void Render(Control target, Size size, string path, double dpi = 96)
    {
        var pixelSize = new PixelSize((int)size.Width, (int)size.Height);
        var dpiVector = new Vector(dpi, dpi);

        using var bitmap = new RenderTargetBitmap(pixelSize, dpiVector);
        target.Measure(size);
        target.Arrange(new Rect(size));
        bitmap.Render(target);
        bitmap.Save(path);
    }
Example #18
0
        protected override Size ArrangeOverride(Size finalSize)
        {
            var x = (AdornedDataGrid.ActualWidth - Control.DesiredSize.Width) / 2;
            var y = (AdornedDataGrid.ActualHeight - Control.DesiredSize.Height) / 2;
            var p = new Point(x, y);
            var r = new Rect(p, finalSize);

            Control.Arrange(r);

            return(finalSize);
        }
Example #19
0
 protected override Size ArrangeOverride(Size finalSize)
 {
     for (int i = 0; i < Children.Count; i++)
     {
         Control child = Children[i];
         if (activeTabIndex == i)
         {
             child.Arrange(new Rect(
                               new Point(1, 3),
                               new Size(Math.Max(0, finalSize.Width - 2),
                                        Math.Max(0, finalSize.Height - 4)
                                        )));
         }
         else
         {
             child.Arrange(Rect.Empty);
         }
     }
     return(finalSize);
 }
Example #20
0
    public static void Render(Control target, Size size, Stream stream, double dpi = 96, bool useDeferredRenderer = false)
    {
        var bounds = SKRect.Create(new SKSize((float)size.Width, (float)size.Height));

        using var pictureRecorder = new SKPictureRecorder();
        using var canvas          = pictureRecorder.BeginRecording(bounds);
        target.Measure(size);
        target.Arrange(new Rect(size));
        CanvasRenderer.Render(target, canvas, dpi, useDeferredRenderer);
        using var picture = pictureRecorder.EndRecording();
        picture.Serialize(stream);
    }
Example #21
0
        /// <summary>
        ///     Default control arrangement is to only arrange
        ///     the first visual child. No transforms will be applied.
        /// </summary>
        protected override Size ArrangeOverride(Size size)
        {
            Size finalSize;

            finalSize = base.ArrangeOverride(size);

            if (_child != null)
            {
                _child.Arrange(new Rect(new Point(), finalSize));
            }
            return(finalSize);
        }
Example #22
0
        protected override Size ArrangeOverride(Size finalSize)
        {
            if (null == content)
            {
                return(finalSize);
            }
            Rect contentRect = new Rect(1, 1,
                                        Math.Max(0, finalSize.Width - 2),
                                        Math.Max(0, finalSize.Height - 2));

            content.Arrange(contentRect);
            return(finalSize);
        }
Example #23
0
        protected override Size ArrangeOverride(Size finalSize)
        {
            Control child = ((IVisual)this).VisualChildren.SingleOrDefault() as Control;

            if (child != null)
            {
                child.Arrange(new Rect(finalSize));
                return(child.ActualSize);
            }
            else
            {
                return(new Size());
            }
        }
        //public MetryHolder(CTextBlock ctxt, int width = 400, int height = 1000)
        //{
        //    var reqSz = new Size(width, height);
        //
        //    ctxt.Measure(reqSz);
        //    ctxt.Arrange(new Rect(0, 0, width, ctxt.DesiredSize.Height == 0 ? height : ctxt.DesiredSize.Height));
        //    ctxt.Measure(reqSz);
        //
        //    var newReqSz = new Size(
        //        ctxt.DesiredSize.Width == 0 ? reqSz.Width : ctxt.DesiredSize.Width,
        //        ctxt.DesiredSize.Height == 0 ? reqSz.Height : ctxt.DesiredSize.Height);
        //    ctxt.Arrange(new Rect(0, 0, newReqSz.Width, newReqSz.Height));
        //
        //    var bitmap = new RenderTargetBitmap(PixelSize.FromSizeWithDpi(newReqSz, Dpi), Dpi);
        //
        //    using (var icontext = bitmap.CreateDrawingContext(null))
        //    using (var context = new DrawingContext(icontext))
        //    {
        //        ctxt.Render(context);
        //    }
        //
        //    Image = bitmap;
        //}

        public MetryHolder(Control ctxt, int width = 400, int height = 1000)
        {
            var reqSz = new Size(width, height);

            ctxt.Measure(reqSz);
            ctxt.Arrange(new Rect(0, 0, width, ctxt.DesiredSize.Height == 0 ? height : ctxt.DesiredSize.Height));
            ctxt.Measure(reqSz);

            var newReqSz = new Size(
                ctxt.DesiredSize.Width == 0 ? reqSz.Width : ctxt.DesiredSize.Width,
                ctxt.DesiredSize.Height == 0 ? reqSz.Height : ctxt.DesiredSize.Height);

            ctxt.Arrange(new Rect(0, 0, newReqSz.Width, newReqSz.Height));

            var bitmap = new RenderTargetBitmap(PixelSize.FromSizeWithDpi(newReqSz, Dpi), Dpi);

            using (var icontext = bitmap.CreateDrawingContext(null))
                using (var context = new DrawingContext(icontext))
                {
                    RenderHelper(ctxt, context);
                }
            Image = bitmap;
        }
Example #25
0
        /// <summary>
        /// Arranges the specified final size.
        /// </summary>
        /// <param name="finalSize">The final size.</param>
        public override void Arrange(RectangleF finalSize)
        {
            base.Arrange(finalSize);

            foreach (Entity entity in Owner.ChildEntities)
            {
                Control control = entity.FindComponent <Control>(false);

                if (control != null)
                {
                    control.Arrange(Transform2D.Rectangle);
                }
            }
        }
Example #26
0
        protected async Task RenderToFile(Control target, [CallerMemberName] string testName = "")
        {
            if (!Directory.Exists(OutputPath))
            {
                Directory.CreateDirectory(OutputPath);
            }

            var immediatePath = Path.Combine(OutputPath, testName + ".immediate.out.png");
            var deferredPath  = Path.Combine(OutputPath, testName + ".deferred.out.png");
            var factory       = AvaloniaLocator.Current.GetService <IPlatformRenderInterface>();

            using (RenderTargetBitmap bitmap = new RenderTargetBitmap(
                       (int)target.Width,
                       (int)target.Height))
            {
                Size size = new Size(target.Width, target.Height);
                target.Measure(size);
                target.Arrange(new Rect(size));
                bitmap.Render(target);
                bitmap.Save(immediatePath);
            }

            using (var rtb = factory.CreateRenderTargetBitmap((int)target.Width, (int)target.Height, 96, 96))
                using (var renderer = new DeferredRenderer(target, rtb))
                {
                    Size size = new Size(target.Width, target.Height);
                    target.Measure(size);
                    target.Arrange(new Rect(size));
                    renderer.UnitTestUpdateScene();

                    // Do the deferred render on a background thread to expose any threading errors in
                    // the deferred rendering path.
                    await Task.Run((Action)renderer.UnitTestRender);

                    rtb.Save(deferredPath);
                }
        }
Example #27
0
        protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize)
        {
            if (Element == null)
            {
                return(finalSize);
            }

            var textBlock = Control;

            if (textBlock == null)
            {
                return(finalSize);
            }

            DebugMessage("ENTER FontSize=[" + textBlock.FontSize + "] BaseLineOffset=[" + textBlock.BaselineOffset + "] LineHeight=[" + textBlock.LineHeight + "]");
            DebugArrangeOverride(finalSize);

            if (DebugCondition && (finalSize.Width > Element.Width || finalSize.Height > Element.Height) && Element.FittedFontSize > Element.MinFontSize)
            {
                System.Diagnostics.Debug.WriteLine("finalSize a bit big!");
            }
            //    MeasureOverride(finalSize);

            double childHeight = Math.Max(0, Math.Min(Element.Height, Control.DesiredSize.Height));
            var    rect        = new Windows.Foundation.Rect();

            switch (Element.VerticalTextAlignment)
            {
            case Xamarin.Forms.TextAlignment.Start:
                break;

            default:
            case Xamarin.Forms.TextAlignment.Center:
                rect.Y = (int)((finalSize.Height - childHeight) / 2);
                break;

            case Xamarin.Forms.TextAlignment.End:
                rect.Y = finalSize.Height - childHeight;
                break;
            }

            rect.Height = childHeight;
            rect.Width  = finalSize.Width;
            Control.Arrange(rect);

            DebugArrangeOverride(finalSize);
            DebugMessage("EXIT");
            return(finalSize);
        }
        protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize)
        {
            if (Element == null)
            {
                return(finalSize);
            }

            Element.IsInNativeLayout = true;

            Control?.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height));

            Element.IsInNativeLayout = false;

            return(finalSize);
        }
Example #29
0
        protected override global::Windows.Foundation.Size ArrangeOverride(global::Windows.Foundation.Size finalSize)
        {
            if (Element == null || Control == null)
            {
                return(finalSize);
            }

            Element.IsInPlatformLayout = true;

            Control?.Arrange(new WRect(0, 0, finalSize.Width, finalSize.Height));

            Element.IsInPlatformLayout = false;

            return(finalSize);
        }
Example #30
0
        protected void RenderToFile(Control target, [CallerMemberName] string testName = "")
        {
            string path = Path.Combine(OutputPath, testName + ".out.png");

            RenderTargetBitmap bitmap = new RenderTargetBitmap(
                (int)target.Width,
                (int)target.Height);

            Size size = new Size(target.Width, target.Height);

            target.Measure(size);
            target.Arrange(new Rect(size));
            bitmap.Render(target);
            bitmap.Save(path);
        }
Example #31
0
        protected void RenderToFile(Control target, [CallerMemberName] string testName = "")
        {
            string path = Path.Combine(OutputPath, testName + ".out.png");

            using (RenderTargetBitmap bitmap = new RenderTargetBitmap(
                (int)target.Width,
                (int)target.Height))
            {
                Size size = new Size(target.Width, target.Height);
                target.Measure(size);
                target.Arrange(new Rect(size));
                bitmap.Render(target);
                bitmap.Save(path);
            }
        }
Example #32
0
        private RenderingBuffer processControl(Control control, List<Control> revalidatedControls)
        {
            RenderingBuffer buffer = getOrCreateBufferForControl(control);
            RenderingBuffer fullBuffer = getOrCreateFullBufferForControl(control);
            //
            LayoutInfo lastLayoutInfo = control.lastLayoutInfo;
            LayoutInfo layoutInfo = control.layoutInfo;
            //
            control.Measure(lastLayoutInfo.measureArgument);
            control.Arrange(lastLayoutInfo.renderSlotRect);
            // if lastLayoutInfo eq layoutInfo we can use last rendered buffer
            //            if (layoutInfo.Equals(lastLayoutInfo) && lastLayoutInfo.validity == LayoutValidity.Render) {
            if (checkRenderingWasNotChangedRecursively(control)) {
                if (control.SetValidityToRender()) {
                    revalidatedControls.Add(control);
                }
                return fullBuffer;
            }
            // replace buffers if control has grown
            if (layoutInfo.renderSize.width > buffer.Width || layoutInfo.renderSize.height > buffer.Height) {
                buffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height);
                fullBuffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height);
                buffers[control] = buffer;
                fullBuffers[control] = fullBuffer;
            }
            // otherwise we should assemble full rendered buffer using childs
            buffer.Clear();
            if (control.RenderSize.Width != 0 && control.RenderSize.Height != 0)
                control.Render(buffer);
            //
            fullBuffer.CopyFrom(buffer);
            foreach (Control child in control.Children) {
                if (child.Visibility == Visibility.Visible) {
                    RenderingBuffer fullChildBuffer = processControl(child, revalidatedControls);
                    fullBuffer.ApplyChild(fullChildBuffer, child.ActualOffset,
                        child.RenderSize, child.RenderSlotRect, child.LayoutClip);
                } else {
                    // чтобы следующий Invalidate для этого контрола
                    // перезаписал lastLayoutInfo
                    if (child.SetValidityToRender()) {
                        revalidatedControls.Add(child);
                    }
                }
            }

            // Save overlappingRect for each control child
            refreshChildrenLastOverlappedRects( control, false );

            if (control.SetValidityToRender()) {
                revalidatedControls.Add(control);
            }
            return fullBuffer;
        }
Example #33
0
        private void updateLayout(Control control, List<Control> revalidatedControls)
        {
            LayoutInfo lastLayoutInfo = control.lastLayoutInfo;
            // работаем с родительским элементом управления
            if (control.Parent != null) {
                bool needUpdateParentLayout = true;
                // если размер текущего контрола не изменился, то состояние ревалидации не распространяется
                // вверх по дереву элементов, и мы переходим к работе с дочерними элементами
                // в противном случае мы добавляем родительский элемент в конец очереди ревалидации, и
                // возвращаем управление
                if (lastLayoutInfo.validity != LayoutValidity.Nothing) {
                    control.Measure(lastLayoutInfo.measureArgument);
            //                    if (lastLayoutInfo.unclippedDesiredSize == control.layoutInfo.unclippedDesiredSize) {
                    if (checkDesiredSizeNotChangedRecursively(control)) {
                        needUpdateParentLayout = false;
                    }
                }
                if (needUpdateParentLayout) {
                    // mark the parent control for invalidation too and enqueue them
                    control.Parent.Invalidate();
                    // мы можем закончить с этим элементом, поскольку мы уже добавили
                    // в конец очереди его родителя, и мы все равно вернемся к нему в след. раз
                    return;
                }
            }
            // работаем с дочерними элементами управления
            // вызываем для текущего контрола Measure&Arrange с последними значениями аргументов
            if (lastLayoutInfo.validity == LayoutValidity.Nothing && control.Parent != null) {
                throw new InvalidOperationException("Assertion failed.");
            }
            // rootElement - особый случай
            if (control.Parent == null) {
                if (control != RootElement) {
                    throw new InvalidOperationException("Control has no parent but is not known rootElement.");
                }
                control.Measure(RootElementRect.Size);
                control.Arrange(RootElementRect);
            } else {
                control.Measure(lastLayoutInfo.measureArgument);
                control.Arrange(lastLayoutInfo.renderSlotRect);
            }
            // update render buffers of current control and its children
            RenderingBuffer buffer = getOrCreateBufferForControl(control);
            RenderingBuffer fullBuffer = getOrCreateFullBufferForControl(control);
            // replace buffers if control has grown
            LayoutInfo layoutInfo = control.layoutInfo;
            if (layoutInfo.renderSize.width > buffer.Width || layoutInfo.renderSize.height > buffer.Height) {
                buffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height);
                fullBuffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height);
                buffers[control] = buffer;
                fullBuffers[control] = fullBuffer;
            }
            buffer.Clear();
            if (control.RenderSize.Width != 0 && control.RenderSize.Height != 0)
                control.Render(buffer);
            // проверяем дочерние контролы - если их layoutInfo не изменился по сравнению с последним,
            // то мы можем взять их последний renderBuffer без обновления и применить к текущему контролу
            fullBuffer.CopyFrom(buffer);
            IList<Control> children = control.Children;
            foreach (Control child in children) {
                if (child.Visibility == Visibility.Visible) {
                    RenderingBuffer fullChildBuffer = processControl(child, revalidatedControls);
                    fullBuffer.ApplyChild(fullChildBuffer, child.ActualOffset,
                        child.RenderSize,
                        child.RenderSlotRect, child.LayoutClip);
                } else {
                    // чтобы следующий Invalidate перезаписал lastLayoutInfo
                    if (child.SetValidityToRender()) {
                        revalidatedControls.Add(child);
                    }
                }
            }

            // Save overlappingRect for each control child
            refreshChildrenLastOverlappedRects( control, false );

            if (control.SetValidityToRender()) {
                revalidatedControls.Add(control);
            }
            addControlToRenderingUpdatedList(control);
        }