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)); }
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) )); }
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 )); }
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); }
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); }
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(); } }
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 )); }
public static IFrameContext CreateRoot(PxSize size) { return(new FrameContext(size, 1)); }
public IFrameContext Create(PxSize size) { return(new FrameContext(size, LayerId + 1)); }
private FrameContext(PxSize size, int layerId) { Size = size; LayerId = layerId; }