private RendererDirect2D Create(PxSize size, out WIC.Bitmap wicBitmap)
        {
            _bitmap = wicBitmap = new WIC.Bitmap(
                WicFactory,
                (int)(size.Width * 1.0f),
                (int)(size.Height * 1.0f),
                WIC.PixelFormat.Format32bppPBGRA,
                WIC.BitmapCreateCacheOption.CacheOnLoad
                );
            wicBitmap.SetResolution(200, 200);

            var renderProps = new D2D1.RenderTargetProperties(
                D2D1.RenderTargetType.Default,
                new D2D1.PixelFormat(
                    DXGI.Format.B8G8R8A8_UNorm,
                    D2D1.AlphaMode.Premultiplied
                    ),
                96,
                96,
                D2D1.RenderTargetUsage.None, //GdiCompatible| D2D1.RenderTargetUsage.ForceBitmapRemoting,
                D2D1.FeatureLevel.Level_DEFAULT
                );

            var wicRenderTarget = new D2D1.WicRenderTarget(
                D2DFactory,
                wicBitmap,
                renderProps
                ); // {DotsPerInch = new Size2F(600, 600)};



            return(new RendererDirect2D(this, wicRenderTarget));
        }
Example #2
0
 public static PxSize GetSize(this IElement element, IFrameContext context, PxSize defaultSize)
 {
     return(new PxSize(
                AA.Width.GetMeasure(element, context, defaultSize.Width),
                AA.Height.GetMeasure(element, context, defaultSize.Height)
                ));
 }
Example #3
0
        public PxMatrix CalcMatrix(PxSize viewPort, PxRectangle imageSize)
        {
            if (Option == PreserveAspectRatioOption.None)
            {
                return(PxMatrix.Translation(
                           viewPort.Width / imageSize.Width,
                           viewPort.Height / imageSize.Height,
                           0,
                           0
                           ));
            }

            var scale = Option == PreserveAspectRatioOption.Meet
        ? Math.Min(
                viewPort.Height / imageSize.Height,
                viewPort.Width / imageSize.Width
                )
        : Math.Max(
                viewPort.Height / imageSize.Height,
                viewPort.Width / imageSize.Width
                );

            var scaledW = imageSize.Width * scale;
            var scaledH = imageSize.Height * scale;

            var scaleX = scaledW / imageSize.Width;
            var scaleY = scaledH / imageSize.Height;

            return(PxMatrix.Translation(
                       scaleX,
                       scaleY,
                       imageSize.X + CalcOffset(AlignX, viewPort.Width, scaledW), // / scaleX,
                       imageSize.Y + CalcOffset(AlignY, viewPort.Height, scaledH) // / scaleY
                       ));
        }
Example #4
0
        public static IDisposable Create(D2D1.RenderTarget target, PxSize size, float opacity)
        {
            var bounds = new DXM.RawRectangleF(0, 0, size.Width, size.Height);

            return(opacity < 1f
        ? new ComplexLayer(target, ref bounds, null, opacity)
        : new SimpleLayer(target, ref bounds) as IDisposable);
        }
Example #5
0
        private static float CalcScale(PxSize frameSize, PxSize textSize)
        {
            var scale      = frameSize.Width / textSize.Width;
            var textHeight = textSize.Height;

            while (textHeight * scale > frameSize.Height)
            {
                scale -= 0.1f;
            }
            return(scale);
        }
Example #6
0
        public static Task Render(IElement element, IFrameContext context, RendererDirect2D render)
        {
            if (TransformHelper.IsHidden(element))
            {
                return(Task.CompletedTask);
            }

            using (TransformHelper.Create(render, element, context))
                using (LayerHelper.Create(render, element, context))
                {
                    var font      = element.GetFont(context);
                    var fill      = element.GetFill(context);
                    var fillBrush = render.CreateBrush(element, context, fill.Brush, fill.Opacity);

                    if (fillBrush == null)
                    {
                        return(Task.CompletedTask);
                    }

                    foreach (var text in element.Children.OfType <ITextContent>())
                    {
                        using (var textLayout = render.CreateTextLayout(font, text.Content, 999999))
                        {
                            var frameSize = context.Size;
                            var textSize  = new PxSize(textLayout.Metrics.WidthIncludingTrailingWhitespace, textLayout.Metrics.Height);
                            var scale     = CalcScale(frameSize, textSize);

                            var matrix = PxMatrix.Translation(
                                scale,
                                scale,
                                (frameSize.Width - (scale * textSize.Width)) / 2f,
                                (frameSize.Height - (scale * textSize.Height)) / 2f
                                );

                            using (TransformHelper.Create(render, matrix))
                            {
                                render.Target.DrawTextLayout(
                                    new DXM.RawVector2(0, 0),
                                    textLayout,
                                    fillBrush,
                                    D2D1.DrawTextOptions.EnableColorFont
                                    );
                            }
                        }
                    }
                    return(Task.CompletedTask);
                }
        }
        public async Task Render(IDocument document, Stream stream)
        {
            var children = document.Children.Count;

            if (children == 0)
            {
                return;
            }
            var svg = document.RootElement;

            if (svg == null)
            {
                throw new Exception("No svg element");
            }

            var pageSize   = new PxSize(1024, 1024);
            var context    = FrameContext.CreateRoot(pageSize);
            var size       = svg.GetSize(context, pageSize);
            var viewPort   = svg.GetViewBox()?.AsRectangle() ?? size.AsRectangle();
            var newContext = context.Create(viewPort.Size);

            using (var render = Create(viewPort.Size, out var bm))
            {
                var dc = render.Target;
                dc.BeginDraw();
                dc.Clear(new RawColor4(1f, 1f, 1f, 1f));
                await render.GetRenderer("svg")(svg, newContext, render);

                dc.EndDraw();

                if (stream != null)
                {
                    Save(bm, stream);
                }
            }
        }
        public async Task Render(IEnumerable <string> docNames, Stream outStream)
        {
            var ticket = Printing.Printing.CreateTicketForPrinter("Microsoft Print to PDF");

            var pms = ticket.PageMediaSize;

            var pageSize = new PxSize(
                (pms.Width != null) ? (float)pms.Width : 4962,
                (pms.Height != null) ? (float)pms.Height : 7014
                );

            using (var target = Printing.Printing.CreatePrintTarget(ticket, "Microsoft Print to PDF", outStream))
                using (var printControl = new D2D1.PrintControl(D2DDevice, WicFactory, target))
                    using (var dc = new D2D1.DeviceContext(D2DDevice, D2D1.DeviceContextOptions.None))
                    {
                        dc.DotsPerInch = new DX.Size2F(600, 600);

                        var pageStack                = new List <RendererDirect2D> ();
                        var pageY                    = 0;
                        var frameContext             = FrameContext.CreateRoot(pageSize);
                        D2D1.CommandList commandList = null;

                        foreach (var fn in docNames)
                        {
                            try
                            {
                                var document = await Loader.Load(new Uri(fn, UriKind.RelativeOrAbsolute));

                                var children = document.Children.Count;
                                if (children == 0)
                                {
                                    continue;
                                }
                                var svg = document.RootElement;
                                if (svg == null)
                                {
                                    continue;
                                }

                                var size       = svg.GetSize(frameContext, pageSize);
                                var viewPort   = svg.GetViewBox()?.AsRectangle() ?? size.AsRectangle();
                                var ratio      = svg.GetPreserveAspectRatio().CalcMatrix(size, viewPort);
                                var renderSize = new PxSize(
                                    (int)(0.5f + (viewPort.Width * ratio.M11)),
                                    (int)(0.5f + (viewPort.Height * ratio.M22))
                                    );

                                if (pageStack.Count > 0 && pageY + renderSize.Height > pms.Height)
                                {
                                    dc.EndDraw();
                                    commandList.Close();
                                    printControl.AddPage(commandList, new DX.Size2F(pageSize.Width, pageSize.Height));
                                    commandList.Dispose();
                                    foreach (var r in pageStack)
                                    {
                                        r.Dispose();
                                    }
                                    pageStack.Clear();
                                    pageY       = 0;
                                    commandList = null;
                                }

                                dc.Transform = DX.Matrix3x2.Translation(0, pageY);

                                if (commandList == null)
                                {
                                    commandList = new D2D1.CommandList(dc);
                                    dc.Target   = commandList;
                                    dc.BeginDraw();
                                }

                                var render = new RendererDirect2D(this, dc);
                                await render.GetRenderer(svg.ElementType)(svg, FrameContext.CreateRoot(renderSize), render);

                                pageStack.Add(render);

                                pageY += (int)renderSize.Height;
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("Skipping {0}", ex);
                                //throw ex;
                            }
                        }

                        if (pageStack.Count > 0)
                        {
                            dc.EndDraw();
                            commandList.Close();
                            printControl.AddPage(commandList, new DX.Size2F(pageSize.Width, pageSize.Height));
                            commandList.Dispose();
                            foreach (var r in pageStack)
                            {
                                r.Dispose();
                            }
                            pageStack.Clear();
                        }

                        // Send the job to the printing subsystem and discard
                        // printing-specific resources.
                        printControl.Close();
                    }
        }
Example #9
0
        public static IDisposable Create(RendererDirect2D render, IElement element, IFrameContext context, PxSize clipSize)
        {
            var clip = new DXM.RawRectangleF(0f, 0f, clipSize.Width, clipSize.Height);

            return(Create(
                       render.Target,
                       render.GetClipGeometry(element, context, element.GetClipPath()),
                       element.GetOpacity(),
                       true,
                       ref clip
                       ));
        }
Example #10
0
 public static IFrameContext CreateRoot(PxSize size)
 {
     return(new FrameContext(size, 1));
 }
Example #11
0
 public IFrameContext Create(PxSize size)
 {
     return(new FrameContext(size, LayerId + 1));
 }
Example #12
0
 private FrameContext(PxSize size, int layerId)
 {
     Size    = size;
     LayerId = layerId;
 }