Beispiel #1
0
        public static IPrintDocumentSource Print(Win2DScene scene, float padding)
        {
            Guard.NotNull(scene, nameof(scene));
            Guard.GreaterThan(padding, 0, nameof(padding));

            var printDocument = new CanvasPrintDocument();

            var sceneBounds = scene.RenderBounds;

            Action <CanvasDrawingSession, PrintPageDescription> renderForPrint = (session, page) =>
            {
                session.Clear(Colors.White);

                var size = page.PageSize.ToVector2();

                var ratio = sceneBounds.Width / sceneBounds.Height;

                var targetSizeX = Math.Min(size.X - (2 * padding), sceneBounds.Width);
                var targetSizeY = targetSizeX / ratio;

                if (targetSizeY > page.PageSize.Height)
                {
                    targetSizeY = Math.Min(size.Y - (2 * padding), sceneBounds.Height);
                    targetSizeX = targetSizeY * ratio;
                }

                var zoom = targetSizeX / sceneBounds.Width;

                session.Transform =
                    Matrix3x2.CreateTranslation(
                        -sceneBounds.Position.X,
                        -sceneBounds.Position.Y) *
                    Matrix3x2.CreateScale(zoom) *
                    Matrix3x2.CreateTranslation(
                        0.5f * (size.X - targetSizeX),
                        0.5f * (size.Y - targetSizeY));

                scene.Render(session, false, Rect2.Infinite);
            };

            printDocument.Preview += (sender, args) =>
            {
                sender.SetPageCount(1);

                renderForPrint(args.DrawingSession, args.PrintTaskOptions.GetPageDescription(1));
            };

            printDocument.Print += (sender, args) =>
            {
                using (var session = args.CreateDrawingSession())
                {
                    renderForPrint(session, args.PrintTaskOptions.GetPageDescription(1));
                }
            };

            return(printDocument);
        }
Beispiel #2
0
        public static async Task RenderScreenshotAsync(Win2DScene scene, ICanvasResourceCreator device, Stream stream, Vector3 background, float?dpi = null, float padding = 20)
        {
            Guard.NotNull(scene, nameof(scene));
            Guard.NotNull(stream, nameof(stream));
            Guard.NotNull(device, nameof(device));
            Guard.GreaterThan(padding, 0, nameof(padding));

            var sceneBounds = scene.RenderBounds;

            var w = sceneBounds.Size.X + (2 * padding);
            var h = sceneBounds.Size.Y + (2 * padding);

            var dpiValue = dpi ?? DisplayInformation.GetForCurrentView().LogicalDpi;

            var dpiFactor = dpiValue / DpiWithPixelMapping;

            var wPixels = (int)(w * dpiFactor);
            var hPixels = (int)(h * dpiFactor);

            var maxPixels = Math.Min(MaxSize, device.Device.MaximumBitmapSizeInPixels - 100);

            var wDiff = wPixels - maxPixels;
            var hDiff = hPixels - maxPixels;

            if (wDiff > 0 || hDiff > 0)
            {
                if (wDiff > hDiff)
                {
                    dpiValue = (int)(dpiValue * ((float)maxPixels / wPixels));
                }
                else
                {
                    dpiValue = (int)(dpiValue * ((float)maxPixels / hPixels));
                }
            }

            using (var target = new CanvasRenderTarget(device, w, h, dpiValue))
            {
                using (var session = target.CreateDrawingSession())
                {
                    session.Clear(background.ToColor());

                    session.Transform =
                        Matrix3x2.CreateTranslation(
                            -sceneBounds.Position.X + padding,
                            -sceneBounds.Position.Y + padding);

                    scene.Render(session, false, Rect2.Infinite);
                }

                await target.SaveAsync(stream.AsRandomAccessStream(), CanvasBitmapFileFormat.Png).AsTask();
            }
        }
Beispiel #3
0
        public static CanvasGeometry ComputeHullGeometry(ICanvasResourceCreator resourceCreator, Win2DScene scene, Win2DRenderNode renderNode)
        {
            Guard.NotNull(scene, nameof(scene));
            Guard.NotNull(renderNode, nameof(renderNode));
            Guard.NotNull(resourceCreator, nameof(resourceCreator));

            var node = renderNode.Node;

            if (!node.HasChildren || node.IsCollapsed)
            {
                return(null);
            }

            IList <Rect2> childBounds =
                node.AllChildren()
                .Select(x => (Win2DRenderNode)scene.FindRenderNode(x)).Union(new[] { renderNode }).Where(x => x.IsVisible)
                .Select(x => Rect2.Inflate(new Rect2(x.TargetLayoutPosition, x.RenderSize), new Vector2(Padding, Padding)))
                .ToList();

            if (childBounds.Count <= 0)
            {
                return(null);
            }

            var hull = ConvexHull.Compute(childBounds);

            var points = RoundCorners(hull);

            return(BuildGeometry(resourceCreator, points));
        }